Android ProgressDialog 过早结束

Posted

技术标签:

【中文标题】Android ProgressDialog 过早结束【英文标题】:Android ProgressDialog ends too early 【发布时间】: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() 线程完成?

【问题讨论】:

【参考方案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,您就应该知道如何以推荐的方式做到这一点。

以上是关于Android ProgressDialog 过早结束的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Android:ProgressDialog 不显示

Android:ProgressDialog 不显示

Android 强制关闭 ProgressDialog

使用自定义 ProgressDialog android

Android 进度条对话框ProgressDialog

AsyncTask Android 关闭 ProgressDialog