java - 线程中的异步回调

标签 java android multithreading

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

相关文章:

java - 如何使用 Spring Cloud Contracts 将 Stub 中的 NULL 值设置为 clientValue

java - 在 java servlet doPost() 方法中发送重定向

java - 如何使用java代码执行FreeSwitch命令

android - 备用短信发件人

android - 无法在 VS2015 Android 模拟器中安装 android 设备

android - 避免 Android Lint 提示未翻译的字符串

python - 当线程完成时通知主线程

java - Android 中动态删除选项卡

multithreading - Delphi IDE 在调试线程时挂起

java - 如何在 Tomcat 正常关闭时获取线程中断/通知?