Основная нить зависает при извлечении данных из URL-адреса в Async Task

Я извлекаю JSON из URL с помощью AsycTask, разбора его и отображения данных в listView. Я также нажимаю кнопку обновления, чтобы снова получить JSON из URL для некоторого обновления. Когда я нажимаю кнопку обновления, происходит следующее: 1) adapter.clear (): очистка адаптера listView для заполнения новых данных. 2) Извлеките JSON из url, проанализируйте и отобразите вновь полученные данные в listView. 3) Между тем при извлечении данных я показываю диалог прогресса.

But when i click on the refresh button, the main UI thread freezes during the execution of AsynTask. I mean the refresh button looks pressed until the AsynTask finishes the job as shown below. enter image description here

Вот мой код:

public class AndroidJSONParsingActivity extends SherlockActivity {

   //JSON Node names
    ArrayList> placeList = new ArrayList>();
    private static final String TAG_PLACES = "places";
    private static final String TAG_PLACE_NAME = "name";
    private static final String TAG_PLACE_CATEGORY = "category";
    private static final String TAG_PLACE_DISTANCE = "distance";
    private static final String TAG_TRAVEL_TIME = "travel_time";
    ListAdapter adapter;
    public static Context con;
    JSONArray places = null;
    ListView list;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        con = this;
        list = (ListView) findViewById(R.id.listView1);
        parseJSON();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.activity_main, menu);

        MenuItem menu_item1 = menu.findItem(R.id.menu_item1);

        menu_item1.setOnMenuItemClickListener(new OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(getApplicationContext(), "refresh",
                        Toast.LENGTH_LONG).show();
                placeList.clear();
                parseJSON();
                return false;
            }
        });

        return true;

    }

    public void parseJSON() {
        try {
            placeList = new JSONParsingTask().execute().get();
        } catch (InterruptedException e) {
           //TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
           //TODO Auto-generated catch block
            e.printStackTrace();
        }

        adapter = new SimpleAdapter(this, placeList, R.layout.list_item,
                new String[] { TAG_PLACE_NAME, TAG_PLACE_CATEGORY,
                        TAG_PLACE_DISTANCE, TAG_TRAVEL_TIME }, new int[] {
                        R.id.name, R.id.category, R.id.distance,
                        R.id.travel_time });

        list.setAdapter(adapter);

        list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                String name = ((TextView) view.findViewById(R.id.name))
                        .getText().toString();
                String category = ((TextView) view.findViewById(R.id.category))
                        .getText().toString();
                String distance = ((TextView) view.findViewById(R.id.distance))
                        .getText().toString();
                String travel_time = ((TextView) view
                        .findViewById(R.id.travel_time)).getText().toString();

                Intent in = new Intent(getApplicationContext(),
                        SingleMenuItemActivity.class);
                in.putExtra(TAG_PLACE_NAME, name);
                in.putExtra(TAG_PLACE_CATEGORY, category);
                in.putExtra(TAG_PLACE_DISTANCE, distance);
                in.putExtra(TAG_TRAVEL_TIME, travel_time);
                startActivity(in);

            }
        });

    }

}

class JSONParsingTask extends
        AsyncTask>> {
    public Boolean flag = false;
    private static String url = "http://some - url";

   //JSON Node names

    private static final String TAG_PLACES = "places";
    private static final String TAG_PLACE_NAME = "name";
    private static final String TAG_PLACE_CATEGORY = "category";
    private static final String TAG_PLACE_DISTANCE = "distance";
    private static final String TAG_TRAVEL_TIME = "travel_time";
    ListAdapter adapter;
    JSONParser jParser;
    ListView list;
    static ArrayList> placeList = new ArrayList>();
    JSONArray places = null;

    ProgressDialog JSONParsingDialog = new ProgressDialog(
            AndroidJSONParsingActivity.con);

    @Override
    protected void onPreExecute() {
        JSONParsingDialog.setMessage("Preparing data...");
        JSONParsingDialog.setCanceledOnTouchOutside(false);
        JSONParsingDialog.setCancelable(false);
        JSONParsingDialog.show();
    }

    @Override
    protected ArrayList> doInBackground(Void... params) {
        JSONParser jParser = new JSONParser();

        final JSONObject json = jParser.getJSONFromUrl(url);

        try {
            places = json.getJSONArray(TAG_PLACES);

            for (int i = 0; i < places.length(); i++) {
                JSONObject c = places.getJSONObject(i);

                String name = c.getString(TAG_PLACE_NAME);
                String category = c.getString(TAG_PLACE_CATEGORY);
                String distance = c.getString(TAG_PLACE_DISTANCE);
                String travel_time = c.getString(TAG_TRAVEL_TIME);

                HashMap map = new HashMap();

                map.put(TAG_PLACE_NAME, name);
                map.put(TAG_PLACE_CATEGORY, category);
                map.put(TAG_PLACE_DISTANCE, distance);
                map.put(TAG_TRAVEL_TIME, travel_time);

                placeList.add(map);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return placeList;
    }

    @Override
    protected void onPostExecute(ArrayList> result) {
       //TODO Auto-generated method stub
        super.onPostExecute(result);
        JSONParsingDialog.dismiss();
    }

}

Все, что мне нужно, когда я нажимаю кнопку обновления, должно быть плавным и не должно зависеть, пока AsynTask не будет завершен. Любая идея, как я могу это сделать?

0
nl ja de
не вызывайте get, он ждет , пока асинтеза не будет закончена ...
добавлено автор njzk2, источник

2 ответы

использование

new JSONParsingTask().execute(); 

.get() блокирует поток вызывающего.

more info: Looking for good example of using get() with an AsyncTask in android

4
добавлено
просто введите его внутри onPostExecute
добавлено автор Rafael T, источник
Вы можете просто использовать свой адаптер в AsyncTask
добавлено автор Stefan de Bruijn, источник
Просто передайте свой адаптер в конструкторе AsyncTask или сделайте его доступным для внутренних классов, если ваша AsyncTask одна
добавлено автор Stefan de Bruijn, источник

Попробуйте вот так:

public class AndroidJSONParsingActivity extends SherlockActivity {

// JSON Node names
ArrayList> placeList = new ArrayList>();
private static final String TAG_PLACES = "places";
private static final String TAG_PLACE_NAME = "name";
private static final String TAG_PLACE_CATEGORY = "category";
private static final String TAG_PLACE_DISTANCE = "distance";
private static final String TAG_TRAVEL_TIME = "travel_time";
ListAdapter adapter;
public static Context con;
JSONArray places = null;
ListView list;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    con = this;
    list = (ListView) findViewById(R.id.listView1);
    fetchJSON();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.activity_main, menu);

    MenuItem menu_item1 = menu.findItem(R.id.menu_item1);

    menu_item1.setOnMenuItemClickListener(new OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {
            Toast.makeText(getApplicationContext(), "refresh",
                    Toast.LENGTH_LONG).show();
            placeList.clear();
            parseJSON();
            return false;
        }
    });

    return true;

}

public void fecthJson(){
    new JSONParsingTask().execute();
}

public void parseJSON(ArrayList> dataList) {

    adapter = new SimpleAdapter(this, dataList, R.layout.list_item,
            new String[] { TAG_PLACE_NAME, TAG_PLACE_CATEGORY,
                    TAG_PLACE_DISTANCE, TAG_TRAVEL_TIME }, new int[] {
                    R.id.name, R.id.category, R.id.distance,
                    R.id.travel_time });

    list.setAdapter(adapter);

    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            String name = ((TextView) view.findViewById(R.id.name))
                    .getText().toString();
            String category = ((TextView) view.findViewById(R.id.category))
                    .getText().toString();
            String distance = ((TextView) view.findViewById(R.id.distance))
                    .getText().toString();
            String travel_time = ((TextView) view
                    .findViewById(R.id.travel_time)).getText().toString();

            Intent in = new Intent(getApplicationContext(),
                    SingleMenuItemActivity.class);
            in.putExtra(TAG_PLACE_NAME, name);
            in.putExtra(TAG_PLACE_CATEGORY, category);
            in.putExtra(TAG_PLACE_DISTANCE, distance);
            in.putExtra(TAG_TRAVEL_TIME, travel_time);
            startActivity(in);

        }
    });

}

}

class JSONParsingTask extends
    AsyncTask>> {
public Boolean flag = false;
private static String url = "http://some - url";

// JSON Node names

private static final String TAG_PLACES = "places";
private static final String TAG_PLACE_NAME = "name";
private static final String TAG_PLACE_CATEGORY = "category";
private static final String TAG_PLACE_DISTANCE = "distance";
private static final String TAG_TRAVEL_TIME = "travel_time";
ListAdapter adapter;
JSONParser jParser;
ListView list;
static ArrayList> placeList = new ArrayList>();
JSONArray places = null;

ProgressDialog JSONParsingDialog = new ProgressDialog(
        AndroidJSONParsingActivity.con);

@Override
protected void onPreExecute() {
    JSONParsingDialog.setMessage("Preparing data...");
    JSONParsingDialog.setCanceledOnTouchOutside(false);
    JSONParsingDialog.setCancelable(false);
    JSONParsingDialog.show();
}

@Override
protected ArrayList> doInBackground(Void... params) {
    JSONParser jParser = new JSONParser();

    final JSONObject json = jParser.getJSONFromUrl(url);

    try {
        places = json.getJSONArray(TAG_PLACES);

        for (int i = 0; i < places.length(); i++) {
            JSONObject c = places.getJSONObject(i);

            String name = c.getString(TAG_PLACE_NAME);
            String category = c.getString(TAG_PLACE_CATEGORY);
            String distance = c.getString(TAG_PLACE_DISTANCE);
            String travel_time = c.getString(TAG_TRAVEL_TIME);

            HashMap map = new HashMap();

            map.put(TAG_PLACE_NAME, name);
            map.put(TAG_PLACE_CATEGORY, category);
            map.put(TAG_PLACE_DISTANCE, distance);
            map.put(TAG_TRAVEL_TIME, travel_time);

            placeList.add(map);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return placeList;
}

@Override
protected void onPostExecute(ArrayList> result) {
   //TODO Auto-generated method stub
    super.onPostExecute(result);
    JSONParsingDialog.dismiss();
    placeList = result;
    parseJson(result);
}

}
2
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

All That JS
All That JS
417 участник(ов)

JS на русском

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)