【问题标题】:Progress dialog async task taking longer time than expected进度对话框异步任务花费的时间比预期的要长
【发布时间】:2015-01-24 09:41:00
【问题描述】:

我是安卓编程新手。我正在开发一个网络爬虫,我正在使用异步任务并且它运行良好。为了让用户了解情况,我正在使用进度对话框。我的问题是,如果我使用进度对话框,我的程序需要更多时间来执行,而当我不使用进度对话框时,它执行得更快。

完成工作 OnCreate 方法

 protected void onCreate(Bundle savedInstanceState) {
    try {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_results);

        Intent intent = getIntent();

        s1 = intent.getStringExtra("Number1");
        s2 = intent.getStringExtra("Number2");
        s3=intent.getIntExtra("selectedItem",0);
        HttpAsyncTask asyncTask = new HttpAsyncTask();
        asyncTask.execute();


    }catch (Exception e)
    {
        messageBox("Exception",e.getMessage());
    }

}

异步任务类

 private class HttpAsyncTask extends AsyncTask<List<String>, Integer, List<String>> {
    private ProgressDialog dialog;
    @Override
    protected void onPreExecute() 
     {
        dialog = new ProgressDialog(Results.this);
        dialog.setIndeterminate(true);
        dialog.setMessage("Please Wait");
        dialog.setCancelable(true);
        dialog.show();
        super.onPreExecute();
    }
    @Override
    protected List<String> doInBackground(List<String>... urls) {
        //android.os.Debug.waitForDebugger();
       // spinner.setVisibility(View.VISIBLE);
        List<String>resultList=new ArrayList<String>();
        try
        {
            if(isCancelled())
                return resultList;

         resultList=WebCrawlerClass.GetPost(s1,s2,s3);

        }catch (Exception e)
            {
                messageBoxs("Error", e.getMessage());
            }
       return resultList;
    }


    // onPostExecute displays the results of the AsyncTask.
    @Override
    protected void onPostExecute(List<String> result)
    {

    if(dialog.isShowing())
    {
     dialog.dismiss();
    }
        if(s3 == 2)
        {
            docListAdapter=new ListViewData(Results.this,result);
        }
        else {
            docListAdapter = new NameNumListData(Results.this, result);
        }

        docList=(ListView)findViewById(R.id.listView2);
        docList.setAdapter(docListAdapter);
        super.onPostExecute(result);
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        this.cancel(true);
    }
}

我错过了什么吗?需要帮助..

感谢和问候, 阿比纳夫

【问题讨论】:

  • 这可能是因为 onPreExecute() 中的工作。如果您在活动中启动对话框并使用 Handler 或任何回调方法通知您asynctask 已完成工作的活动,以便您可以停止进度对话框,进度对话框的额外负载将从 asynctask 中删除
  • @IchigoKurosaki 谢谢你……让我试试,我会去找你的……
  • @IchigoKurosaki 如果你能给我一些链接...那就太好了。
  • 我会为你设计答案..

标签: java android android-asynctask progressdialog


【解决方案1】:

在你的活动中

// 启动进度对话框 ..

Handler handler = new Handler() {
      @Override
       public void handleMessage(Message msg) {
       super.handleMessage(msg);
         // dismiss the progress dialog
      }
    };
 HttpAsyncTask asyncTask = new HttpAsyncTask(handler);
 asyncTask.execute();

在你的 asynctask 类中

private class HttpAsyncTask extends AsyncTask<List<String>, Integer, List<String>> {

    private Handler handler = null;
    public HttpAsyncTask (Handler handler) {
        this.handler = handler;
    }

    protected Void doInBackground(Void... params) {
       //Perform your task
       // When you know that task is finished , fire following code
                if (null != handler) {
                  Message message = handler.obtainMessage();
                        message.obj = Any data you want to sent to the activity
                        message.what = 1 ; ( Optional )
                        handler.sendMessage(message);
                }

    }

因此,当从 doInbackground 调用 sendMessage 函数时,您的活动中的 handleMessage 将被触发,然后您应该关闭进度对话框

希望这将改善您所面临的性能问题

【讨论】:

    【解决方案2】:

    删除 super.onPreExecute();在 onPreExecute() 方法中并检查。它可能会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 2020-04-01
      相关资源
      最近更新 更多