我知道这个答案已经回答了多次,但我不能让它正常工作。它从活动A开始,其中用户需要通过功能authenticate登录。当用户点击按钮登录时,我希望出现progressdialog对话框,直到函数authenticate得到响应。当你成功时,你会去另一个活动,在那里你可以浏览应用程序。无论如何,有时当网络很慢,或者如果你在移动互联网上,我仍然看到活动A几秒钟没有做任何事情,而auth函数正在进行。完成后,系统跳转到活动b。
我试过使用睡眠线程的东西,但这不是重点…我想要的进度对话框出现时,用户点击登录和消失时,认证功能已完成。
在AsyncTask的帮助下,我有时会看到对话框闪现一秒钟,但不是它应该如何…我也想使用asynctask加载我的列表视图,但对话框没有做它应该做的。
我的AsyncTask代码
public class HeavyWorker extends AsyncTask<String, Context, Void> {
private ProgressDialog dialog;
public HeavyWorker() {
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(AuthenticationActivity.this);
dialog.setMessage("Gettting data");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected Void doInBackground(String... params) {
authenticate(username, password, autoLogin);
return null;
}
@Override
protected void onPostExecute(Void result) {
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
}
我调用asynctask
builder.setTitle(R.string.dialog_authenticate)
.setIcon(R.drawable.ic_launcher)
.setView(viewInflater)
.setPositiveButton(R.string.dialog_button_login,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
EditText ETusername = (EditText) viewInflater.findViewById(R.id.username);
EditText ETpassword = (EditText) viewInflater.findViewById(R.id.password);
CheckBox optionAutoLogin = (CheckBox) viewInflater
.findViewById(R.id.autoLogin);
checkAutoLogin = 0;
if (optionAutoLogin.isChecked()) checkAutoLogin = 1;
username = ETusername.getText().toString();
password = ETpassword.getText().toString();
new HeavyWorker().execute();
//authenticate(ETusername.getText().toString(), ETpassword.getText().toString(), checkAutoLogin);
}
})
验证成功时是否完成活动A ?在这种情况下,可以跳过onPostExecute
文档给了你一个很好的例子:你可以在onProgressUpdate(...)
中发布进度,并可以通过publishProgress(int i)
从doInBackground
更新它
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
//DO YOUR PROGRESSBAR THINGS HERE
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}