Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程中的异步回调_Java_Android_Multithreading - Fatal编程技术网

Java 线程中的异步回调

Java 线程中的异步回调,java,android,multithreading,Java,Android,Multithreading,我学安卓,有点小问题。也许我能处理,但我想知道这类问题的最佳解决方案 其目的是对外部服务进行API调用(使用Volley),并将结果保存到数据库(使用Room) 我已经开始模拟API结果并将其保存到数据库。按照良好的实践,我使用了分离线程来实现这一点。后来我添加了making API request和RequestQueue,现在我有了类似的东西: // HomeActivity.java protected void onCreate(Bundle savedInstanceState) {

我学安卓,有点小问题。也许我能处理,但我想知道这类问题的最佳解决方案

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

我已经开始模拟API结果并将其保存到数据库。按照良好的实践,我使用了分离线程来实现这一点。后来我添加了making API request和RequestQueue,现在我有了类似的东西:

// 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);
}