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