检查另一个线程中的任务是否已在Android中完成

时间:2012-08-21 14:05:11

标签: java android multithreading sleep

我正在从网站下载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中有这样的东西吗?或者有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我使用回调

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) {
        // ...
    }
}

这就是我所做的,而且效果很好。

答案 2 :(得分:0)

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

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

查看Usage下的示例。 onPreExecute和onPostExecute的重载在UI线程上运行,因此您可以执行诸如在PreExecute上显示进度对话框并将其解除onPostExecute之类的内容。

答案 3 :(得分:0)

doSomeWork();
new MyAsyncTask().execute(url);

AsyncTask:

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

 protected void onPostExecute(Long result) {
     continueWorkHere();
 }
}