0

メインアクティビティのサブクラスである進行状況ダイアログクラスがあります。それ自体は問題なく動作します。

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;
    }

}

http postリクエストを送信し、結果を解析するgetNewsというメソッドがあります。これには数秒かかります。このメソッドでは、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;
    }

}
4

1 に答える 1

1

時間のかかるタスクは、doInBackgroundで呼び出す必要があります。doInBackgroundメソッドには何も表示されません。注意してください。doInBackgroundのUIには触れないでください。ここにサンプルコードがあります。

于 2011-04-05T04:28:32.333 に答える