Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从不同的AsyncTask更改AsyncTask中的布局_Java_Android_Android Layout_Android Asynctask_Lazy Loading - Fatal编程技术网

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
    上运行,您现在可以 使用此数据更新您的UI

  • onPostExecute
    方法中,开始n(n是您创建的ImageURL的计数 从您获得的数据中获得)新的
    AsyncTasks
    (让我来命名它
    ImageAsyncTask
    )。这些
    ImageAsyncTasks
    ”应在上下载图像 他们的
    doInBackground
    方法。下载完成后,
    onPostExecute
    将被触发,您现在即可获得图像。你可以更新你的用户界面 在
    onPostExecute
    方法上,因为它在
    UIThread
    上运行


  • 顺便说一句,我建议您使用图像加载库。我目前正在使用它。

    我看到的问题是,如果我在第一个异步任务中初始化图像并将其添加到布局中,我就不能在第二个异步任务中使用相同的ImageView。这意味着,我也不能在新的辅助AsyncTask上使用第一个布局中的TableRows。您可以访问/使用在UIThread(onPreExecute、onPostExecute或onProgressUpdate)上运行的AsyncTask方法中的任何内容视图。你应该再次检查你的代码。也许您不是从第一个AsynTask添加ImageView,而是在第二个AsynTask中获得NPE。