如何将重排序工作远离UI线程

时间:2012-10-23 11:45:40

标签: android android-asynctask

我有一种数字键盘和一个列表。当用户选择键盘时,我调用一个函数对列表进行排序。用户可以随时按下按钮显示列表。

但是这个列表可能非常大,超过500,所以我在考虑不再在UI线程上进行排序。

这样做的最佳方式是什么?

我应该使用常规线程,asynctask吗?

我唯一担心的是,当asynctask尚未完成时,用户也可以单击按钮显示列表。我该怎么处理?

THX

5 个答案:

答案 0 :(得分:3)

绝对选择AsyncTask,它专为UI之外的繁重工作而设计。关于您的上一个问题,禁用make按钮并在AsyncTask的onPostExecute()中启用它。欢呼声。

答案 1 :(得分:2)

你肯定需要一个asynctask。在onCreate方法中隐藏您的所有buttonstextviews。在后台执行某些操作之前,需要向用户显示加载栏或微调器,以便用户无法单击您创建的任何按钮。这是一个示例:

class LoadAllProducts extends AsyncTask<String, String, String> {
    protected void onPreExecute() {
         super.onPreExecute();
         pDialog = new ProgressDialog(Academic.this);
         pDialog.setMessage("Loading. Please wait...");
         pDialog.setIndeterminate(false);
         pDialog.setCancelable(false);
         pDialog.show();
}

protected String doInBackground(String... args) {
       //Do something
       return null;
}

protected void onPostExecute(String file_url) {
    // dismiss the dialog after getting all products
    pDialog.dismiss();
    // updating UI from Background Thread
    runOnUiThread(new Runnable() {
           public void run() {
             //finally show your button
          }
    });
}

在使用此代码之前,请确保已声明pDialog。在我的程序中,我使用了微调器。

答案 2 :(得分:1)

AsyncTask看起来很适合这个...任务。您还可以创建某种状态成员来检查排序任务是否正在运行,并根据它启动任务或在用户按下按钮时不执行任何操作。作为替代方案,如果某些内容发生了变化,您也可以取消该任务并开始一个新任务。

答案 3 :(得分:0)

转到异步任务,您可以在onPreExecute()中显示一些进度条,并在onPostExecute()中停止它。 在屏幕上运行进度条之前,用户无法进行任何操作。

答案 4 :(得分:0)

您可以像其他人一样使用AsyncTask,或者您可以创建一个线程并运行长时间运行的操作并使用处理程序相应地更新UI。请查看此链接http://www.vogella.com/articles/AndroidPerformance/article.html