0

在我的应用程序中,我做了不同的请求来获取网站的 HTML 代码。之后,App 会解析 HTML,可能会执行并解析另一个请求。最后,ListView 填充了解析后的数据。

现在我读到 Volley 在 UI 线程的 onResponse 方法中运行所有代码。所以也许最好在一个新线程中进行解析。我实现它如下。

new Thread(new HTMLSiteParsingTask(response)).start();

class HTMLSiteParsingTask implements Runnable {
  String mResponse;
  HTMLSiteParsingTask(String response) {
    mResponse = response;
  }
  public void run() {
  //do something...
  callerActivity.addData(dataHashMap);
  }
}

在处理结束时,我调用 MainActivity 的方法将数据添加到 Listview “callerActivity.addData(dataHashMap);”。此方法执行以下操作:

runOnUiThread(new AddItemsTask(ItemList));

AsyncTask 和 Thread 之间是否有区别,所以我应该使用其中之一?还是无所谓?有没有更好的方法来做这些事情?

谢谢您的回答

4

2 回答 2

0

AsyncTaks 最适合谷歌自己推荐的短时间工作。这种方式使您可以轻松地直接访问 ui 线程。缺点是它非常而且我对调用它的活动或片段感到非常疲倦。此外,如果您需要直接通知活动,则必须传递活动的引用(这可能导致内存泄漏)或使用事件总线或广播接收器等方法。

如果您决定通过简单方法传递活动,请确保将其放在 WeakReference 中,并在使用之前检查是否为 null、isFinishing 和 isDestroyed。这将避免潜在的崩溃,并且周参考让活动在需要时收集垃圾。

线程在 AsyncTask 内部使用,并由 AsyncTask 通过打桩等智能方式进行处理。如果您确实自己使用它,您将负责清理和汇集以及所有效率。此外,这种方式不像 AsyncTasks 中的内置方法那样容易访问 UI 线程

有很多选项可用于后台任务,例如服务、意图服务、加载程序、作业调度程序等。这实际上取决于您对这些任务的理解和使用程度以及它们如何根据您的逻辑进行匹配。没有一种正确的方法。

有很多库也可以帮助解决所有这些问题,例如 volley、rx-java 等等。

我个人几乎会在需要时以及合适的时候使用所有可用的工具。快乐编码:)

于 2018-01-18T20:08:30.400 回答
0

实现自定义请求。将您的解析逻辑放在parseNetworkResponse方法中 - Volley 将从工作线程中调用它。

于 2018-01-18T20:14:20.557 回答