Java 线程中的异步回调
我学安卓,有点小问题。也许我能处理,但我想知道这类问题的最佳解决方案 其目的是对外部服务进行API调用(使用Volley),并将结果保存到数据库(使用Room) 我已经开始模拟API结果并将其保存到数据库。按照良好的实践,我使用了分离线程来实现这一点。后来我添加了making API request和RequestQueue,现在我有了类似的东西:Java 线程中的异步回调,java,android,multithreading,Java,Android,Multithreading,我学安卓,有点小问题。也许我能处理,但我想知道这类问题的最佳解决方案 其目的是对外部服务进行API调用(使用Volley),并将结果保存到数据库(使用Room) 我已经开始模拟API结果并将其保存到数据库。按照良好的实践,我使用了分离线程来实现这一点。后来我添加了making API request和RequestQueue,现在我有了类似的东西: // HomeActivity.java protected void onCreate(Bundle savedInstanceState) {
// 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
公共类ImportData实现可运行{
@凌驾
公开募捐{
字符串url=”http://api.com";
JsonObjectRequest JsonObjectRequest=新JsonObjectRequest
(Request.Method.GET,url,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONObject响应){
字符串数据=response.toString();
List toAdd=new ArrayList();
//…正在格式化数据。。。
App.get().getDB().dataDao().insertAll(toAdd);
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
}
});
App.INSTANCE.getRequestQueue().add(jsonObjectRequest);
}
问题是,调用后,在
onResponse
函数中,我又在UI线程中,所以我无法对数据库进行操作。我应该在那里创建新线程吗?如果是,我必须将响应变量传递到此线程中,所以我认为这不是一个好主意。还有什么其他选项,哪一个是最好的?这是我的问题。没有除了在这里创建一个新线程,或者您必须能够在主线程以外的线程上接收网络结果(Rx java with Reformation可以帮助您),或者您可以使用,如果您想遵循当前代码,只需使用将数据传递到async任务并在doInBackground()中进行数据库事务这似乎是一个很好的截击候选
您可以创建一个扩展请求的类,并执行您想要的任何后台操作(如保存到数据库)在parseNetworkResponse中,因为它是从工作线程调用的。然后,当请求完成时,您可以在deliverResponse中执行任何后续UI线程操作,因为该回调是在主线程上进行的。或者您在onResponse中收到asyncresult(没有线程)或者在线程内调用同步操作,但第二种方法的效果与仅在一个线程中执行相同
// 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);
}