0

我正在从网站下载 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

4 回答 4

1

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

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

于 2012-08-21T14:10:10.117 回答
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) {
        // ...
    }
}

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

于 2012-08-21T14:23:13.047 回答
0

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

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

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

于 2012-08-21T14:10:44.517 回答
0
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();
 }
}
于 2012-08-21T14:19:56.243 回答