java - Android锁定线程中的CountDownLatch

标签 java android multithreading android-volley countdownlatch

我刚刚开始在我的 Android 应用程序中使用 CountDownLatch。目前我正在尝试向我的 api 发出两个 Volley 请求,并等待数据被检索并存储后再继续执行线程。

这是我的代码示例:

    // new CountDownLatch for 2 requests
    final CountDownLatch allDoneSignal = new CountDownLatch(2);

    transactions.getResourcesForRealm(Contact.class, "", new ICallBack<Contact>() {
        @Override
        public void onSuccess(ArrayList<Contact> resources, String resourceId) {
            transactions.createRealmObject(resources, Contact.class);

            allDoneSignal.countDown();
        }

        @Override
        public void onFail(ArrayList<Contact> resources) {

        }
    });

    transactions.getResourcesForRealm(Meeting.class, "", new ICallBack<Meeting>() {
        @Override
        public void onSuccess(ArrayList<Meeting> resources, String resourceId) {
            transactions.createRealmObject(resources, Meeting.class);

            allDoneSignal.countDown();
        }

        @Override
        public void onFail(ArrayList<Meeting> resources) {

        }
    });

    try {
        allDoneSignal.await();
        // continue executing code
        // ...
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

问题是它似乎没有“完成”倒计时并因此卡住,因为闩锁从未被释放。我已确认 API 请求正在运行并且 onSuccess 回调已成功命中,但线程挂起。

更新 我刚刚注意到当 CountDownLatch 设置为 0 时,它触发 onSuccess,但是当我将它设置为任何大于 0 的值时,它会卡住并且 onSuccess 永远不会被调用。线程似乎有些古怪。

最佳答案

您的代码太容易出错,您需要在 finally block 中调用 countDown() 并在 onFail 中调用它,否则如果失败,您的应用程序将卡住永远。所以你的代码应该是这样的:

transactions.getResourcesForRealm(Contact.class, "", new ICallBack<Contact>() {
    @Override
    public void onSuccess(ArrayList<Contact> resources, String resourceId) {
        try {
            transactions.createRealmObject(resources, Contact.class);
        } finally {
            allDoneSignal.countDown();
        }
    }

    @Override
    public void onFail(ArrayList<Contact> resources) {
        allDoneSignal.countDown();
    }
});

transactions.getResourcesForRealm(Meeting.class, "", new ICallBack<Meeting>() {
    @Override
    public void onSuccess(ArrayList<Meeting> resources, String resourceId) {
        try {
            transactions.createRealmObject(resources, Meeting.class);
        } finally {
            allDoneSignal.countDown();
        }
    }

    @Override
    public void onFail(ArrayList<Meeting> resources) {
        allDoneSignal.countDown();
    }
});

关于java - Android锁定线程中的CountDownLatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38694614/

相关文章:

android - 如何将多个 C++ cmake 项目链接到 Android Studio/gradle 项目?

java - 单击 RecyclerView 中属于 CardView 的 ImageButton

java - 哪些变量是线程安全的?

java - 线程转储中的 "Locked ownable synchronizers"是什么?

java - 如何使用restfb请求缩短超时时间?

Javafx场景切换导致舞台尺寸增加

android - 在约束布局中添加 View 并以编程方式将它们设置为全屏

ios - NSFetchedResultsController 在后台线程上使用核心数据

java - 为什么我的背景在重绘后会出现故障?

java - 在 FragmentPagerAdapter 中设置图标和标题