Android Volley 以及响应中 Tasks 或 Threads 的使用
Android Volley and the usage of Tasks or Threads in the response
在我的应用程序中,我执行不同的请求来获取网站的 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 之间有区别吗?我应该使用其中之一吗?还是无所谓?有没有更好的方法来做这些事情?
感谢您的回答
AsyncTaks 最适合 ui 根据 google 他们自己的建议进行短时间的工作。通过这种方式,您可以轻松地直接访问 ui 线程。缺点是它非常而且我对 activity 或调用它的片段非常厌倦。此外,如果您需要直接通知 activity,则必须传递 activity 的引用(这可能导致内存泄漏)或使用事件总线或广播接收器等方法。
如果您决定通过 activity 作为简单方法,请确保将其放在 WeakReference 中,并在使用它之前检查其是否为 null、isFinishing 和 isDestroyed。这将避免潜在的崩溃和周参考让我们 activity 在需要时收集垃圾。
线程在 AsyncTasks 内部使用,并通过 AsyncTask 以智能方式处理。如果您确实自己使用它,您将负责清理和汇集以及所有效率。此外,这种方式无法像 AsyncTasks
中的 inbuilt 方法那样轻松访问 UI 线程
后台任务有很多可用选项,例如服务、意图服务、加载器、作业调度程序等。这实际上取决于您对这些任务的理解和使用程度,以及它们如何符合您的逻辑。没有一个正确的方法。
有很多库也可以帮助解决所有这些问题,例如 volley、rx-java 等等。
我个人几乎会在需要和适合时使用所有可用的工具。编码愉快:)
实施 custom request。将您的解析逻辑放在 parseNetworkResponse
方法中——它会被 Volley 从工作线程中调用。
在我的应用程序中,我执行不同的请求来获取网站的 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 之间有区别吗?我应该使用其中之一吗?还是无所谓?有没有更好的方法来做这些事情?
感谢您的回答
AsyncTaks 最适合 ui 根据 google 他们自己的建议进行短时间的工作。通过这种方式,您可以轻松地直接访问 ui 线程。缺点是它非常而且我对 activity 或调用它的片段非常厌倦。此外,如果您需要直接通知 activity,则必须传递 activity 的引用(这可能导致内存泄漏)或使用事件总线或广播接收器等方法。
如果您决定通过 activity 作为简单方法,请确保将其放在 WeakReference 中,并在使用它之前检查其是否为 null、isFinishing 和 isDestroyed。这将避免潜在的崩溃和周参考让我们 activity 在需要时收集垃圾。
线程在 AsyncTasks 内部使用,并通过 AsyncTask 以智能方式处理。如果您确实自己使用它,您将负责清理和汇集以及所有效率。此外,这种方式无法像 AsyncTasks
中的 inbuilt 方法那样轻松访问 UI 线程后台任务有很多可用选项,例如服务、意图服务、加载器、作业调度程序等。这实际上取决于您对这些任务的理解和使用程度,以及它们如何符合您的逻辑。没有一个正确的方法。
有很多库也可以帮助解决所有这些问题,例如 volley、rx-java 等等。
我个人几乎会在需要和适合时使用所有可用的工具。编码愉快:)
实施 custom request。将您的解析逻辑放在 parseNetworkResponse
方法中——它会被 Volley 从工作线程中调用。