Android ProgressDialog 结束得太早
Android ProgressDialog ends too early
我是 运行 一个 AsyncTask
,它打开一个 HttpConnection
并用它在 doInBackground
函数中下载 JSON。
这是我的 AsyncTask:
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,dismiss()
在 onPostExecute()
中正确初始化了它。
问题是进度对话框只显示几分之一秒就立即结束,导致应用程序转移到下一个activity,没有完全执行它在 doInBackground()
部分中的任务。
我应该怎么做才能使 progressDialog 持续到 doInBackground()
线程完成?
我想是因为这个:
AsyncQueryTask fbqt = new AsyncQueryTask();
fbqt.execute(url);
Intent intent = new Intent(context, NextActivity.class);
startActivity(intent);
您正在 LoginActivity
上使用 ProgressDialog
,但就在您执行 fbqt
之后,您启动了另一个 activity (NextActivity
),它将 LoginActivity
在暂停周期,所以我想这会关闭对话框!
注意:我不理解你的代码逻辑,但我认为你是在从 fbqt
获得结果后尝试启动 NextActivity
,如果是,那么你实施的是错误的,你应该使用接口从 AsyncTask
获取回调,然后启动您的 NextActivity
.
您的方式可能会导致 window 泄漏。
Intent intent = new Intent(context, NextActivity.class);
startActivity(intent);
将上面的代码放在 onPostExecute() 方法中。
我是 运行 一个 AsyncTask
,它打开一个 HttpConnection
并用它在 doInBackground
函数中下载 JSON。
这是我的 AsyncTask:
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,dismiss()
在 onPostExecute()
中正确初始化了它。
问题是进度对话框只显示几分之一秒就立即结束,导致应用程序转移到下一个activity,没有完全执行它在 doInBackground()
部分中的任务。
我应该怎么做才能使 progressDialog 持续到 doInBackground()
线程完成?
我想是因为这个:
AsyncQueryTask fbqt = new AsyncQueryTask();
fbqt.execute(url);
Intent intent = new Intent(context, NextActivity.class);
startActivity(intent);
您正在 LoginActivity
上使用 ProgressDialog
,但就在您执行 fbqt
之后,您启动了另一个 activity (NextActivity
),它将 LoginActivity
在暂停周期,所以我想这会关闭对话框!
注意:我不理解你的代码逻辑,但我认为你是在从 fbqt
获得结果后尝试启动 NextActivity
,如果是,那么你实施的是错误的,你应该使用接口从 AsyncTask
获取回调,然后启动您的 NextActivity
.
您的方式可能会导致 window 泄漏。
Intent intent = new Intent(context, NextActivity.class);
startActivity(intent);
将上面的代码放在 onPostExecute() 方法中。