异步延迟程序流 /屏幕冻结



我有一个简单的登录屏幕。如果您单击"登录",则在我们等待背景中的异步键以检查登录凭据时应出现进度栏。

如果我在背景中没有异步箱的代码运行,我的进度栏立即出现。但是,如果我使用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()完成,并且无法绘制其他所有内容

最新更新