【发布时间】:2014-01-10 01:31:56
【问题描述】:
我对 Android 比较陌生,并且正在开发一个应用程序,该应用程序会将位图加载到使用 ImageView 动态创建的布局中。布局和 ImageView 的数量基于一些动态数据(即 API 调用)。我想在动态创建位图并将它们添加到主布局后将它们加载到这些 ImageView 中。由于我将创建多个动态布局并加载多个位图,因此无法在主线程上同步完成。我目前正在使用基于 AsyncTasks 的解决方案,但我认为可能有更有效的方法(可能使用 Handler/Runnable)。
目前,我已经通过以下方式实现了一个使用 AsyncTasks 的解决方案:
1) 从主线程启动第一个 AsyncTask
for(Event event : events.getEventList()) {
// Create an UpdateCalendarUITask to update the UI
CalendarUpdateTask calendarTask = new CalendarUpdateTask(this, parentView);
calendarTask.execute(event);
}
2)创建并填充布局(添加Text和Image视图),将新创建的动态视图添加到布局中,并在完成时回调主线程(使用接口)。
public class CalendarUpdateTask extends AsyncTask<Event, Void, RelativeLayout> {
private final WeakReference<Activity> activityReference;
private final WeakReference<ViewGroup> parentViewReference;
....
public CalendarUpdateTask(Context context, ViewGroup parentView) {
parentViewReference = new WeakReference<ViewGroup>(parentView);
activityReference = new WeakReference<Activity>((Activity) context);
}
@Override
protected RelativeLayout doInBackground(Event... params) {
myEvent = params[0];
return updateGameView(myEvent); // returns created RelativeLayout
}
@Override
protected void onPostExecute(RelativeLayout result) {
super.onPostExecute(result);
// Add the Game/Event view to the Events View
if( // Reference and nulls checks ) {
ViewGroup parentView = parentViewReference.get();
parentView.addView(result);
TaskListener listener = (TaskListener) activityReference.get();
listener.loadImages(myEvent);
}
}
....
}
3) 监听函数 loadImages(...) 启动另一个 AsyncTask 来加载位图(类似于this)
这工作正常。但是,加载大量图像仍然有点慢,因为直到创建视图之后才加载位图。我之前不能调用它,因为在创建 ImageView 之前我没有对它的引用。我无法从 CalendarUpdateTask 启动第二个 AsyncTask,因为它必须始终从主线程启动。
理想情况下,我希望同时启动这两个操作,并在两个操作完成后通知回调,以便将位图加载到新的 ImageView 中。
必须有更好的选择对吗?提前致谢。
【问题讨论】:
标签: java android multithreading bitmap android-asynctask