【问题标题】:Android Volley and the usage of Tasks or Threads in the responseAndroid Volley 和响应中任务或线程的使用
【发布时间】:2018-06-27 23:44:12
【问题描述】:

在我的应用程序中,我执行不同的请求来获取网站的 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 之间是否有区别,所以我应该使用其中之一?还是无所谓?有没有更好的方法来做这些事情?

感谢您的回答

【问题讨论】:

    标签: android multithreading android-asynctask android-volley android-thread


    【解决方案1】:

    实现custom request。将解析逻辑放在 parseNetworkResponse 方法中 - Volley 将从工作线程中调用它。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-18
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多