Java 从不同的AsyncTask更改AsyncTask中的布局
我想做以下几件事。我想显示一个包含信息和图像的列表。这些图片需要一段时间来加载,所以我想我会做不同的事情。我将使用两个异步任务。第一种方法创建所有布局,并用除图像之外的数据填充布局。第二个只是将图像插入到布局中。我遇到的问题是,我不知道这怎么可能 在我的第一个异步任务中,我将创建表格布局和行,然后用数据填充它们Java 从不同的AsyncTask更改AsyncTask中的布局,java,android,android-layout,android-asynctask,lazy-loading,Java,Android,Android Layout,Android Asynctask,Lazy Loading,我想做以下几件事。我想显示一个包含信息和图像的列表。这些图片需要一段时间来加载,所以我想我会做不同的事情。我将使用两个异步任务。第一种方法创建所有布局,并用除图像之外的数据填充布局。第二个只是将图像插入到布局中。我遇到的问题是,我不知道这怎么可能 在我的第一个异步任务中,我将创建表格布局和行,然后用数据填充它们 headline [i].setText( headlineArr [i] ); date [i].setText( realDate );
headline [i].setText( headlineArr [i] );
date [i].setText( realDate );
source [i].setText( sourceArr [i] );
description [i].setText( descriptionArr [i] );
这只是我的代码的一部分,以了解如何创建布局
在这里,我首先创建TableLayouts和TableRows
tableLayout [i] = new TableLayout (getActivity());
headingRow [i] = new TableRow (getActivity());
headlineRow [i] = new TableRow (getActivity());
imageDescRow[i] = new TableRow (getActivity());
spaceView [i] = new LinearLayout (getActivity());
然后我用数据填充文本视图
headline [i].setText( headlineArr [i] );
date [i].setText( realDate );
source [i].setText( sourceArr [i] );
description [i].setText( descriptionArr [i] );
然后,我将文本视图添加到表格中,并将表格添加到布局中。代码当然要大得多,而且比我刚刚做的要多。而且它工作起来没有任何问题。唯一仍然遇到的问题是图像加载时间太长,我不想仅仅因为正在加载图像就阻止用户使用我的应用程序
最好的方法是什么?我想我应该在onPostExecute方法中从当前AsyncTask创建另一个AsyncTask,并将图像的URL作为参数传递。然后在DoinBackground方法中,我会添加图像。但是如何在新的AsyncTask中使用来自另一个AsyncTask的布局?如果我把图片留空,会不会破坏整个布局
做这样一个延迟加载的最佳方法是什么?我看这里没有任何问题
AsyncTask
的onPosExecute
方法在UIThread
上运行,您可以访问那里的任何ui组件。总而言之,您的流程必须如下所示:
AsyncTask
加载数据,让我将其命名为NoImageAsyncTask
。这
任务将对其运行的doInBackground
方法执行长时间操作
在与UIThread
不同的线程上NoImageAsyncTask
完成时,其onPosExecute
方法将
调用。由于onPostExecute
方法在UIThread
上运行,您现在可以
使用此数据更新您的UIonPostExecute
方法中,开始n(n是您创建的ImageURL的计数
从您获得的数据中获得)新的AsyncTasks
(让我来命名它
ImageAsyncTask
)。这些ImageAsyncTasks
”应在上下载图像
他们的doInBackground
方法。下载完成后,onPostExecute
将被触发,您现在即可获得图像。你可以更新你的用户界面
在onPostExecute
方法上,因为它在UIThread
上运行顺便说一句,我建议您使用图像加载库。我目前正在使用它。我看到的问题是,如果我在第一个异步任务中初始化图像并将其添加到布局中,我就不能在第二个异步任务中使用相同的ImageView。这意味着,我也不能在新的辅助AsyncTask上使用第一个布局中的TableRows。您可以访问/使用在UIThread(onPreExecute、onPostExecute或onProgressUpdate)上运行的AsyncTask方法中的任何内容视图。你应该再次检查你的代码。也许您不是从第一个AsynTask添加ImageView,而是在第二个AsynTask中获得NPE。