【发布时间】:2013-08-06 20:20:54
【问题描述】:
我从Activity 开始一个AsyncTask。当 AsyncTask 完成执行时,我需要发送一个广播,该广播需要调用 Activity 方法来更新 UI。
任何实现这一目标的好方法。
【问题讨论】:
-
我认为,这种情况最好使用观察者模式。
标签: android android-asynctask broadcastreceiver
我从Activity 开始一个AsyncTask。当 AsyncTask 完成执行时,我需要发送一个广播,该广播需要调用 Activity 方法来更新 UI。
任何实现这一目标的好方法。
【问题讨论】:
标签: android android-asynctask broadcastreceiver
是的。
如果AsyncTask 是Activity 的内部类,那么它可以访问任何成员变量和Activity 方法。如果不是,那么您可以简单地将变量传递给它的构造函数,甚至是对Activity 的引用,以从onPostExecute() 调用Activity 方法。没有任何代码很难说别的。
要传递您的 Activity 的实例并使用其方法(如果它是一个单独的类),那么您可以创建一个构造函数并执行类似的操作
public class MyTask extends AsyncTask<...> // add your params
{
private MyActivity activty;
public MyTask (MyActivity act)
{
this.activty = activty;
}
// ...
}
在onPostExecute() 中添加类似
activity.myMethod();
然后像这样调用任务
MyTask task = new MyTask(this); // pass a reference of the activity
task.execute(); // add params if needed
如果AsyncTask 是与Activity 不同的文件,那么您可以通过see this answer on how to use an interface 获得callback
【讨论】:
请使用接口。
interface INotifyChange {
void notifyChange(); // You can use params to transfer data :D
}
在Activity中你应该实现这个interface。
YourActivity extends Activity implements INotifyChange {
@Override
public void notifyChange() {
// Right here, you can Update UI.
}
}
当您创建 AsyncTask
的新实例时例子:
YourAsyncTask mTask = new YourAsyncTask(this); // You put INotifyChange
在 YourAsyncTask
private INotifyChange iNotifyChange;
public YourAsyncTask(INotifyChange iNotifyChange) {
this.iNotifyChange = iNotifyChange;
}
// 当你完成 doInBackground 或任何你想更新 UI 的地方,请使用 iNotifyChange.notifyChange()
例子:
@Override
public void onPostExecute(ResultType mResult) {
iNotifyChange.notifyChange();
}
我经常用这种方式来更新进度条。在这种情况下,我在方法中使用参数:
例子:
iNotifyChange.notify(progress);
【讨论】:
您是否考虑过覆盖 AsyncTask 的 onPostExecute() 方法来更新 UI?试试这样的:
AsyncTask<String, Void, Bitmap> task = new AsyncTask<String, Void, Bitmap>(imageView)
{
private ImageView imageView;
public AsyncTask(ImageView imageView)
{
this.imageView = imageView;
}
@Override
protected Bitmap doInBackground (String... params)
{
if(params.length > 0)
{
String filePath = params[0];
// Load Bitmap from file
return bitmap;
}
}
@Override
protected void onPostExecute(Bitmap result)
{
imageView.setImageBitmap(result);
}
}
task.execute(filePath);
【讨论】: