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 过早结束的主要内容,如果未能解决你的问题,请参考以下文章