我从AsyncTask
开始Activity
。当AsyncTask
完成执行时,我需要发送一个需要调用Activity
方法来更新UI的广播。
任何实现这一目标的好方法。
答案 0 :(得分:4)
是
如果AsyncTask
是您Activity
的内部类,则它可以访问任何成员变量和Activity
方法。如果不是,那么您只需将变量传递给其构造函数,甚至可以引用Activity
来调用Activity
中的onPostExecute()
方法。没有任何代码,很难说其他很多。
要传递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
分开的单独文件,那么您callback
可以see this answer on how to use an interface
答案 1 :(得分:3)
请使用界面。
interface INotifyChange {
void notifyChange(); // You can use params to transfer data :D
}
在活动中,您应该实现此界面。
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);
答案 2 :(得分:1)
您是否考虑过覆盖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);