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