Android-асинхронный ход выполнения отложен - PullRequest
0 голосов
/ 05 апреля 2011

У меня есть класс диалога прогресса, который является подклассом моей основной деятельности. Что само по себе работает нормально.

public class UpdateFeedTask extends AsyncTask<Void, Void, Void> {

    ProgressDialog loading;
    @Override
    protected void onPreExecute() { 
        loading = ProgressDialog.show(NewsFeedActivity.this,"Please wait...", "Retrieving data ...", true);
    }

    @Override
    protected void onProgressUpdate(Void... progress) {

    }


    @Override
    protected void onPostExecute(Void result) {

        loading.dismiss();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        return null;
    }

}

У меня есть метод getNews, который отправляет http-запрос и анализирует результат, это занимает несколько секунд. В этом методе я вызываю UpdateFeedTask для асинхронного отображения диалогового окна хода выполнения, но, похоже, оно не делает это одновременно. Кажется, что диалоговое окно хода выполнения открывается только после завершения http-запроса, поэтому вместо отображения диалогового окна хода выполнения и отправки запроса сначала отображается метод getNews, а затем на короткое время отображается диалоговое окно выполнения в течение доли секунды. Как сделать так, чтобы диалоговое окно отображалось до получения данных? Вот как я называю диалог прогресса

public void getNews(){

            //show the progress dialog
    new UpdateFeedTask().execute();


    //go fetch some data
    WheruClient newsFeedLocation = new WheruClient();

    try {

        newsFeedArray = newsFeedLocation.getLocationActivity(sessionKey,page,filter,when);


    }catch (ClientProtocolException e) {
        Toast.makeText(getApplicationContext(),e.getMessage(), Toast.LENGTH_LONG).show();
    } catch (IOException e) {
        Toast.makeText(getApplicationContext(),e.getMessage(), Toast.LENGTH_LONG).show();
    }catch (JSONException e) {
        Toast.makeText(getApplicationContext(),e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

** РЕДАКТИРОВАТЬ новый асинхронный класс отправляет http-запрос в фоновом режиме и возвращает массив json, но я получаю фатальную ошибку, которая читает

04-07 15: 33: 02.967: ОШИБКА / AndroidRuntime (11004): вызвано: java.lang.RuntimeException: невозможно создать обработчик внутри потока, который не вызвал Looper.prepare ()

Я читаю ваши примеры, и мне кажется, что я что-то упускаю из-за работы в фоновом режиме, есть мысли?

public class UpdateFeedTask extends AsyncTask<Void, Void, JSONArray> {


    @Override
    protected void onPreExecute() { 
        //loading = ProgressDialog.show(NewsFeedActivity.this,"Please wait...", "Retrieving data ...", true);
    }

    @Override
    protected void onProgressUpdate(Void... progress) {

    }


    @Override
    protected void onPostExecute(JSONArray result) {

        //loading.dismiss();
        updateFeed(result);
    }

    @Override
    protected JSONArray doInBackground(Void... params) {

        WheruClient newsFeedLocation = new WheruClient();

        try {
            newsFeedArray = newsFeedLocation.getLocationActivity(sessionKey,page,filter,when);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return newsFeedArray;
    }

}

1 Ответ

1 голос
/ 05 апреля 2011

В doInBackground нужно вызывать трудоемкую задачу. Я ничего не вижу в вашем методе doInBackground. Осторожно, не трогайте пользовательский интерфейс в doInBackground. У меня есть пример кода здесь.

...