1

我有一个应用程序加载一个对话框,其中包含在对话框的 XML 布局中指定的一些图像。我已经阅读了很多关于在 Android 中使用图像并注意 VM 预算的内容,因此我相信任何可能占用大量内存的图像处理都应该在主线程之外处理。话虽如此,我想知道使用 ASyncTask 从 UI 线程加载整个布局是否明智。我有一个工作代码,但我无法通过一些谷歌搜索来确定这是否是一种好的做法。这是下面的代码。

这是当用户按下按钮加载对话框时触发的 case 语句。

case R.id.showDialog:

    vibrator.vibrate(vibrateMilis);

    mDialog = new Dialog(getActivity(), R.style.CustomDialog);

    new LoadLayout().execute("");

break;

这是 ASyncTask

private class LoadLayout extends AsyncTask<String, Void, String> 
{

    ProgressDialog progressDialog;

        @Override
        protected String doInBackground(String... params) 
        {

            mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            mDialog.setContentView(R.layout.dialog_layout);
            mDialog.setCancelable(true);

            return null;
        }

        @Override
        protected void onPostExecute(String result)
        {

            progressDialog.cancel();

            mDialog.show();

        }

        @Override
        protected void onPreExecute() 
        {

            progressDialog = new ProgressDialog(
                    getActivity());
            progressDialog.setMessage("Loading...");
            progressDialog.setCancelable(false);
            progressDialog.show();

        }

        @Override
        protected void onProgressUpdate(Void... values) 
        {

            // Do nothing

        }

}

所以这段代码有效,但我的问题是这个。这被认为是好的做法吗?我的口味似乎有点hacky。我没有在多次 Google 搜索中遇到这个问题,所以这就是我有点担心的原因。我的意思是,如果这是一种好的做法,它会被记录在某个地方吗?

感谢您的任何意见。

4

3 回答 3

2

你有没有参考android开发者网站。你的方法是错误的。如需更多指导,请参阅Vogella文档。它很好地解释了 AsyncTask。

另请参阅下面的 AsyncTask 示例代码。

    // The definition of our task class
   private class PostTask extends AsyncTask<String, Integer, String> {
   @Override
   protected void onPreExecute() {
      super.onPreExecute();
      displayProgressBar("Downloading...");
   }

   @Override
   protected String doInBackground(String... params) {
      String url=params[0];

      // Dummy code
      for (int i = 0; i <= 100; i += 5) {
        try {
          Thread.sleep(50);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
         publishProgress(i);
      }
      return "All Done!";
   }

   @Override
   protected void onProgressUpdate(Integer... values) {
      super.onProgressUpdate(values);
      updateProgressBar(values[0]);
   }

   @Override
   protected void onPostExecute(String result) {
      super.onPostExecute(result);
      dismissProgressBar();
   }
   }

希望对您有很大帮助。

享受编码... :)

于 2012-11-08T04:04:40.530 回答
0

我认为你做错了,因为:

首先,当调用doInBackground()方法时,它会在其他线程中,你只能在主线程中改变UI元素。

其次,显示对话框不浪费时间,你可以在 onPreExecute() 或 onPostExecute(String result) 中调用它,只需在 doInBackground() 中执行让用户等待的操作,例如从网络或数据库获取数据。

于 2012-11-08T03:00:17.650 回答
0

您不能在后台线程中加载整个布局(请注意AsyncTask.postExecute()在主线程上执行)。因为所有的 UI 组件都应该从 only 修改Main Thread(也称为 UI 线程)。您可以使用后台线程来收集显示 UI 所需的信息。

于 2012-11-08T04:19:01.250 回答