【问题标题】:Alter layout in AsyncTask from a different AsyncTask从不同的 AsyncTask 更改 AsyncTask 中的布局
【发布时间】:2013-10-29 09:49:15
【问题描述】:

我想做以下事情。我想显示一个包含信息和图像的列表。这些图像需要一段时间才能加载,所以我想我会做不同的事情。我会使用两个 AsyncTasks。第一个创建所有布局并用除图像之外的数据填充它。第二个只是将图像插入到布局中。我遇到的问题是,我不知道这怎么可能?

在我的第一个 AsyncTask 中,我正在创建 TableLayouts 和行,然后用数据填充它们

这只是我的一些代码,以了解我如何创建布局

这里我首先创建了 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());

然后我用数据填充 TextViews

headline    [i].setText( headlineArr    [i] );
date        [i].setText( realDate           );
source      [i].setText( sourceArr      [i] );
description [i].setText( descriptionArr [i] );

然后我将 TextViews 添加到表格中,并将表格添加到布局中。代码当然要大得多,而且比我刚才所做的要多得多。它工作没有任何问题。唯一仍然遇到的问题是图像加载需要很长时间才能加载,我不想仅仅因为图像正在加载而阻止用户使用我的应用程序。

最好的方法是什么?我以为我会从当前的 asynctask 在 onPostExecute 方法中创建另一个 AsyncTask 并将图像的 URL 作为参数传递。然后在 doInBackgroundMethod 中添加图像。但是如何在新的 AsyncTask 中使用来自另一个 AsyncTask 的布局?如果我将图像留空,它不会破坏整个布局吗?

进行这种延迟加载的最佳方法是什么?

【问题讨论】:

    标签: java android android-layout android-asynctask lazy-loading


    【解决方案1】:

    我认为这里没有任何问题。 AsyncTaskonPosExecute 方法在 UIThread 上运行,您可以在那里访问任何 ui 组件。总而言之,您的流程必须是这样的:

    1. 使用AsyncTask 加载数据让我将其命名为NoImageAsyncTask。这 任务将对其运行的doInBackground 方法执行长时间操作 在与UIThread 不同的线程上。

    2. NoImageAsyncTask 完成时,它的onPosExecute 方法将是 调用。由于onPostExecute 方法在UIThread 上运行,您现在可以 用这些数据更新你的 UI。

    3. onPostExecute方法处,开始n(n是你的imageUrls的个数 从你得到的数据中获得)新的AsyncTasks(让我命名它 ImageAsyncTask)。这些ImageAsyncTasks'应该下载图像 他们的doInBackground 方法。下载完成后onPostExecute 将被触发,你现在得到图像。您可以更新您的用户界面 在onPostExecute 方法上,因为它在UIThread 上运行。

    顺便说一句,我建议您使用库来加载图像。我目前正在为此使用Shutterbug

    【讨论】:

    • 我看到的问题是,如果我在第一个 AsyncTask 中初始化图像并将其添加到布局中,我不能在第二个 AsyncTask 中使用相同的 ImageView。这意味着,我也不能在我的新辅助 AsyncTask 上使用第一个布局中的 TableRows
    • 您可以通过在 UIThread 上运行的 AsyncTask 方法(onPreExecute、onPostExecute 或 onProgressUpdate)访问/使用任何内容视图。您应该再次检查您的代码。也许您没有从第一个 AsynTask 添加您的 ImageView,而您在第二个 AsyncTask 中获得了 NPE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    相关资源
    最近更新 更多