我学习 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/