【问题标题】:Checking if task in another thread has already finished in Android检查另一个线程中的任务是否已经在 Android 中完成
【发布时间】:2012-08-21 14:05:10
【问题描述】:

我正在从网站下载 html 源代码并将其显示在 TextView 上。它正在另一个线程中下载,我想在它完成时显示它。所以。我必须暂停主线程,直到它完成。现在我这样做:

    MyAsyncTask task = new MyAsyncTask(this);
    task.execute();
    Thread.sleep(6000);
    ((TextView) findViewById(R.id.textView1)).setText(task.result);

但正如您所见,这不是最好的方法。我需要类似“sleepUntil(boolean is MyTaskCompleated)”的东西。 Java中是否有类似的东西。或者有什么更好的方法吗?

【问题讨论】:

标签: java android multithreading sleep


【解决方案1】:

让 UI 线程休眠与在 UI 线程本身中执行实际工作没有什么不同。这两种情况都会导致 UI 无响应,并可能导致“应用程序无响应”消息。

您的目标似乎是在执行此工作时不允许用户执行任何其他操作。一种替代方法是使用进度对话框阻止 UI,并在 AsyncTask 子类的 onPostExecute() 方法中使用 dismiss() 对话框。

【讨论】:

    【解决方案2】:

    我使用回调

    MyCallback.java

    public interface MyCallback<T> {
        public void onComplete(T result);
    }
    

    MyAsyncTask.java

    public class MyAsyncTask extends AsyncTask<Void, Void, Boolean> {
    
        private MyCallback<Boolean> mCallback;
    
        public MyAsyncTask(MyCallback<Boolean> callback) {
            mCallback = callback;
        }
    
        @Override
        protected void onProgressUpdate(Void... progress) {
            super.onProgressUpdate(progress);
            // ...
        }
    
        @Override
        protected Boolean doInBackground(Void... params) {
            // ...
        }
    
        @Override
        protected void onPostExecute(Boolean result) {
            if (mCallback != null) {
                mCallback.onComplete(result); // will call onComplete() on MyActivity once the job is done
            }
        }
    
    }
    

    在此示例中,此回调将不接受任何参数并返回 Boolean

    现在你要做的就是让你的调用类(例如MyActivity)实现MyCallback

    public class MyActivity extends Activity implements MyCallback<Boolean> {
        // ...
    
        xxx {
            MyAsyncTask myAsyncTask = new MyAsyncTask(this); // the callback
            myAsyncTask.execute();
        }
    
        // ...
    
        @Override
        protected void onComplete(Boolean result) {
            // ...
        }
    }
    

    我就是这样做的,效果很好。

    【讨论】:

      【解决方案3】:

      我建议创建一个扩展 Asynctask 的类,然后在重载方法中执行您的工作。这将使您能够在另一个线程上运行您的任务,并在结果完成后让它执行代码。

      http://developer.android.com/reference/android/os/AsyncTask.html

      查看用法下的示例。 onPreExecute 和 onPostExecute 的重载在 UI 线程上运行,因此您可以执行一些操作,例如在 PreExecute 上显示进度对话框并在 PostExecute 上关闭它。

      【讨论】:

        【解决方案4】:
        doSomeWork();
        new MyAsyncTask().execute(url);
        

        异步任务:

        private class MyAsyncTask extends AsyncTask<URL, Void, Void> {
         protected void doInBackground(URL... urls) {
             downloadHtml(urls[0]); 
         }
        
         protected void onPostExecute(Long result) {
             continueWorkHere();
         }
        }
        

        【讨论】:

          猜你喜欢
          • 2019-05-24
          • 2014-02-21
          • 2021-07-13
          • 2020-08-28
          • 1970-01-01
          • 2017-05-20
          • 2016-06-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多