gpt4 book ai didi

java - 线程中的异步回调

转载 作者:行者123 更新时间:2023-11-29 23:43:56 25 4
gpt4 key购买 nike

我学习 Android 并且有一些小问题。可能我能够处理它,但我想知道此类问题的最佳解决方案。

目的是对外部服务进行 API 调用(使用 Volley),并将结果保存到数据库(使用 Room)。

我已经开始模拟 API 结果并将其保存到数据库中。按照良好的做法,我使用单独的线程来做到这一点。后来我添加了使用 RequestQueue 发出 API 请求,现在我有了类似的东西:

// HomeActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
importData();
}

private void importData() {
Thread importData = new Thread(new ImportData());
importData.start();
importData.join();
}

.

// ImportData.java
public class ImportData implements Runnable {

@Override
public void run() {

String url = "http://api.com";

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

@Override
public void onResponse(JSONObject response) {
String data = response.toString();

List<Data> toAdd = new ArrayList<>();
// ... formating data ...

App.get().getDB().dataDao().insertAll(toAdd);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});

App.INSTANCE.getRequestQueue().add(jsonObjectRequest);
}

问题是,在调用之后,在 onResponse 函数中我再次处于 UI 线程中,所以我无法对数据库进行操作。我应该在那里创建新线程吗?如果是这样,我将不得不将响应变量传递到该线程中,所以我认为这不是个好主意。还有哪些其他选择,哪个是最好的?这是我的问题。

最佳答案

这似乎是创建 Volley 的不错选择 custom request .

您可以创建一个扩展 Request 的类,并在 parseNetworkResponse 中执行任何您想要的后台操作(例如保存到您的数据库),因为这是从工作线程调用的。然后,当 Request 完成时,您可以在 deliverResponse 中执行任何后续 UI 线程操作,因为该回调是在主线程上进行的。

关于java - 线程中的异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51620603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com