线程中的异步回调

罗宾71

我学习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自定义请求的不错选择

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章