【问题标题】:Android ProgressDialog ends too earlyAndroid ProgressDialog 过早结束
【发布时间】:2017-09-28 09:07:16
【问题描述】:

我正在运行一个AsyncTask,它打开一个HttpConnection 并使用它在doInBackground 函数中下载JSON。

这是我的异步任务:

    public class AsyncQueryTask extends AsyncTask<URL, Void, String>{
    String jsonString = "";
    ProgressDialog progressDialog;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = new ProgressDialog(LoginActivity.this);
        progressDialog.setCancelable(false);
        progressDialog.setMessage("Getting Ready...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setProgress(0);
        progressDialog.show();
    }

    @Override
    protected String doInBackground(URL... urls) {
        URL restURL = urls[0];
        try {
            //--------------------------------------------
            // Some initialization
            //--------------------------------------------
            HttpURLConnection urlCon = (HttpURLConnection) restURL.openConnection();
            InputStream in = urlCon.getInputStream();
            Scanner scan = new Scanner(in).useDelimiter("\\A");
            jsonString = scan.hasNext()? scan.next() : "";

            try{
                JSONArray bookArr = new JSONArray(jsonString);
                for(int i=0;i<bookArr.length();i++){
                    // Some JSON string processing...
                }

            } catch(Exception e){
                Log.e("Err", "@Activity");
                e.printStackTrace();
            }
            //----------------------------------------------------

            return jsonString;
        } catch(IOException ioe){
            ioe.printStackTrace();
        }
        return null;
    }

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

我在这里称它为:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        URL url = // URL for fetching JSON string
        if (/*Some condition*/) {
            //----------------------------------------------
            // Some other tasks
            //----------------------------------------------
            AsyncQueryTask fbqt = new AsyncQueryTask();
            fbqt.execute(url);

            Intent intent = new Intent(context, NextActivity.class);
            startActivity(intent);
         }
    }

如您所见,我在onPreExecute() 中正确初始化了progressDialog,并在onPostExecute() 中正确初始化了dismiss()

问题是进度对话框只显示了几分之一秒,它立即结束,导致应用程序转移到下一个活动,而没有完全执行它在doInBackground() 部分。

我应该怎么做才能让 progressDialog 持续到doInBackground() 线程完成?

【问题讨论】:

    标签: android android-asynctask progressdialog


    【解决方案1】:

    您的方式可能会导致窗口泄漏。 Intent intent = new Intent(context, NextActivity.class); startActivity(intent); 将上述代码放入 onPostExecute() 方法中。

    【讨论】:

      【解决方案2】:

      我想是因为这个:

       AsyncQueryTask fbqt = new AsyncQueryTask();
       fbqt.execute(url);
      
       Intent intent = new Intent(context, NextActivity.class);
       startActivity(intent);
      

      你在LoginActivity 上吃ProgressDialog 但是在你执行fbqt 之后你启动另一个活动(NextActivity) 把LoginActivity 置于暂停周期,所以我想这会关闭对话框!


      注意:我不理解您的代码逻辑,但我认为您在从fbqt 获得结果后尝试启动NextActivity,如果是,那么您实现的内容是错误的,您应该使用接口来获取回调从AsyncTask 然后启动你的NextActivity

      【讨论】:

      • 在我执行完AsyncTask之后,LoginActivity已经完成了,应该开始下一个Activity了。如果在 AsyncTask 执行后无法调用 startActivity() 函数,我应该在哪里调用它?
      • @JeobMallari 但您需要在 asynck 任务完成后启动 NextActivity,对吗?我的意思是你想等到它完成然后启动NextActivty
      • 是的,我想等到 AsyncTask 完成后再启动下一个活动
      • @JeobMallari 好的,我也这么认为,只需检查此answer,您就应该知道如何以推荐的方式做到这一点。
      猜你喜欢
      • 2011-12-20
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2015-01-08
      • 2011-08-19
      相关资源
      最近更新 更多