Java Android:将位图加载到动态视图

Java Android:将位图加载到动态视图,java,android,multithreading,bitmap,android-asynctask,Java,Android,Multithreading,Bitmap,Android Asynctask,我对安卓系统比较陌生,正在开发一款应用程序,可以将位图加载到带有ImageView的动态创建布局中。布局和图像视图的数量基于一些动态数据,即API调用。我想在动态创建位图后将其加载到这些ImageView中,并将其添加到主布局中。因为我将创建多个动态布局并加载多个位图,所以这不能在主线程上同步完成。我目前正在使用一种基于AsyncTasks的解决方案,但我认为可能有一种更有效的方法使用Handler/Runnable 目前,我已通过以下方式实现了一个使用AsyncTasks的解决方案: 1从主线

我对安卓系统比较陌生,正在开发一款应用程序,可以将位图加载到带有ImageView的动态创建布局中。布局和图像视图的数量基于一些动态数据,即API调用。我想在动态创建位图后将其加载到这些ImageView中,并将其添加到主布局中。因为我将创建多个动态布局并加载多个位图,所以这不能在主线程上同步完成。我目前正在使用一种基于AsyncTasks的解决方案,但我认为可能有一种更有效的方法使用Handler/Runnable

目前,我已通过以下方式实现了一个使用AsyncTasks的解决方案:

1从主线程启动第一个异步任务

for(Event event : events.getEventList()) {
  // Create an UpdateCalendarUITask to update the UI
  CalendarUpdateTask calendarTask = new CalendarUpdateTask(this, parentView);
  calendarTask.execute(event);
}
2创建并填充布局添加文本和图像视图,将新创建的动态视图添加到布局,并在完成时使用接口调用主线程

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侦听器函数加载图像。。。启动另一个加载位图的异步任务,类似于

这样行。但是,加载大量图像仍然有点慢,因为位图在创建视图之后才加载。我以前不能调用它,因为在创建ImageView之前,我没有对它的引用。我无法从CalendarUpdateTask启动第二个异步任务,因为它必须始终从主线程启动

理想情况下,我更愿意同时启动这两个操作,并在两个操作完成后通知回调,以便将位图加载到新的ImageView中


一定有更好的选择,对吗?提前感谢。

您应该使用类似ListView或GridView的东西,并带有适配器来跟踪数据对象。这些内置类自动管理可见和不可见的内容,并在需要时请求您提供视图。此时您应该创建ImageView实例。加载图像是另一个需要注意的问题,因为从开始加载图像到加载完成之间,保留视图可能会被破坏。

如果您只需要将图像从服务器加载到特定视图,则有不同的库可以做到这一点:

通用图像加载器。 谷歌截击 这些LIB将请求加载此位图的URL和视图,它们还提供不同图像加载点的列表器。 这些lib还可以将它们缓存在磁盘上,这样应用程序就不会一次又一次地获取它们。并将创建一个Hashmap,其中键作为图像的URL,值作为位图

以我的方式,使用AsyncTask对于这种特殊情况不是一种好方法,因为即使它们在后台线程上运行,但多个AsyncTask也会一个接一个地同步运行

因此,如果您只想加载图像,这将是一个很好的方法


如果您有任何疑问,请随时询问。

我正在加载的图像实际上存储在我的drawable文件夹中,但在连接到服务器之前,我不知道要加载哪些图像。我不确定这些库是否有过滥。AsyncTask可以与executeOnExecutor和ThreadPoolExecutor并行运行?是的,您可以使用ThreadPoolExecutor调整AsyncTasks的执行方式。是的,我已经查看了ListView,我认为这是另一种可能的解决方案。我想我需要一个带有自定义对象的ListView,因为我实际上是在一个ScrollView中插入一组带有多个文本和图像视图的RelativeLayouts。你有没有关于如何做到这一点的例子?对不起,我没有现成的例子可以分享。使用XML布局和适配器(可能是加载程序)自己获取图像。寻找一些关于适配器或其他资源的GoogleIO对话,有很多。在了解了这一点之后,我使用的是一个列表视图,每个项目视图都有一个自定义的布局。谢谢你的帮助。