1

progressDialog.dismissがonPostExecute()で実行されていても、AsyncTaskの進行状況ダイアログは閉じません。

SOに関する関連する質問に対する多くの回答を実装しようとしましたが、これまでのところ成功していません。

非常に基本的なことを見落としているに違いないと思いますが、行き詰まっています。

説明とコードスニペットへのポインタは素晴らしいでしょう、ありがとう。

主要

public class Main extends Activity {
    String result;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        asyncTask task = new asyncTask("Loading ...", this);
        try {
            result = task.execute("Question").get();
        }
        catch (Exception e) {
            Log.e("Error: ", e.toString());
        }
    }
}

asyncTask

public class asyncTask extends AsyncTask<String, Void, String> {

    private ProgressDialog progressDialog;
    private String message;
    private Context context;

    public asyncTask(String msg, Context ctx) {
        this.context = ctx;
        message = msg;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = new ProgressDialog(context);
        progressDialog.show(context, "", message, true, false);
    }

    @Override
    protected String doInBackground(String... params) {
        int count = 100000;
        for (int i = 0; i < count; i++) {
           // waste time
        }
        return "Answer";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        progressDialog.dismiss();
    }
}
4

5 に答える 5

9

実際にあなたはやっています:

progressDialog.show(context, "", message, true, false);

代わりに次のようになります:

progressDialog = ProgressDialog.show(context, "", message, true, false);

showメソッドを静的に呼び出して、自分に割り当てる必要がありますprogressDialog

于 2012-12-07T07:51:08.193 に答える
2

この変更をonPostExecute

@Override
protected void onPostExecute(String result) {
    try{
           if(progrssDialog.isShowing()){
                    progressDialog.dismiss();
           }  
    }
  catch(Exception e){
      e.printStackTrace();
  }
  finally
  {
       progressDialog.dismiss();
  }

}
于 2012-12-07T07:07:56.307 に答える
2

私が見つけた一般的な問題は、可変スコープです。ほとんどの場合、ProgressDialogはメソッド内で定義され、そのメソッドの外部からはアクセスできません。

あなたはそれをそのように宣言する必要があります、

Public Class MainActivity extends Activity {

ProgressDialog progressDialog;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

private class asyncTask extends AsyncTask<String, Void, String> {

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    progressDialog.dismiss();
}
}
于 2013-09-16T12:31:21.053 に答える
1

交換

task.execute("Question").get();

task.execute("Question");

.get()強制的main threadに待つようにあなたに電話することによって。UIがハングする/ハングする可能性があります。

于 2012-12-07T07:08:08.367 に答える
-3
    progressDialog.dismiss();

これをReturnステートメントの前のdoInBackground()メソッドに入れます。

于 2012-12-07T07:06:54.887 に答える