我有一个简单的登录屏幕。如果您单击"登录",则在我们等待背景中的异步键以检查登录凭据时应出现进度栏。
如果我在背景中没有异步箱的代码运行,我的进度栏立即出现。但是,如果我使用asynctask,我在之后设置了,我会使我的进度栏出现,则应用程序在我单击"登录"的确切时刻冻结。然后等待直到异步的结果( get()
命令),然后再冻结,使我的进度栏无用。
这是一个众所周知的问题吗?您如何解决它?
这是我在哪里设置异步函数的方式, 我显示进度栏。
showProgress(true, "Logging in ...");
mAuthTask = new InternetConnection();
String arguments = "email="+mEmail+"&pwd="+mPassword;
boolean k = mAuthTask.makeConnection("ADDRESS", arguments, getBaseContext());
String f = mAuthTask.getResult();
这是我的异步。downloadUrl()
设置HttpURLConnection
。这起作用,我对其进行了测试。
private DownloadData data = new DownloadData();
public boolean makeConnection(String url, String arguments, Context context) {
if(isWifi(context) || isMobile(context)) {
argsString = arguments;
data.execute(url);
return true;
} else {
return false; //No network available.
}
}
public String getResult() {
try {
return data.get();
} catch (InterruptedException e) {
return "Error while retrieving data.";
} catch (ExecutionException e) {
return "Error while retrieving data.";
}
}
private class DownloadData extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... url) {
try {
return downloadUrl(url[0]);
} catch (IOException e) {
return "Unable to retrieve data.";
}
}
这样做:
@Override
protected void onPreExecute() {
Asycdialog.setMessage("Working");
Asycdialog.getWindow().setGravity(Gravity.CENTER_VERTICAL);
Asycdialog.getWindow().setGravity(Gravity.CENTER_HORIZONTAL);
Asycdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
Asycdialog.setCancelable(false);
//Dialog Show
Asycdialog.show();
super.onPreExecute();
,然后在OnPostexecute中:
protected void onPostExecute(String result) {
// hide the dialog
Asycdialog.dismiss();
super.onPostExecute(result);
}
使用来自不同类的同一异步任务:
class MainActivity{
new MyTask().execute();
}
class DifferentActivity {
new MyTask().execute();//a new instance
}
class MyTask extends AsyncTask{
public MyTask(Context context){
}//Pass in context.
}
如果您想要一致的进度对话框,将上下文传递给构造函数。
要从Doinbackground发布进度,您可以使用以下内容:
publishProgress(progress);
Asycdialog.setMax(lines);
Asycdialog.incrementProgressBy(1);
如果进度是字符串,则行是最大项目数。
您不应该致电get()
它阻止UI等待结果返回结果,使异步不再具有异步。
你有
private DownloadData data = new DownloadData();
你有
data.get(); // this why it freezes
和
private class DownloadData extends AsyncTask<String, Void, String>
http://developer.android.com/reference/android/os/asynctask.html#get()
您只需要
data.execute(url);
并且,如果您的异步性是活动类的内部类别类别,则可以在doInbackground
中返回结果,并在onPostExecute
中更新UI。如果不是,您可以将接口用作对活动的回调来返回结果。
您的问题与您从UI线程调用getResult
有关。getResult
调用data.get()
是一个阻止操作。这就是为什么您要冻结的原因。您的UI Thread
正在等待get()
完成,并且无法绘制其他所有内容