簡體   English   中英

Android鎖定線程中的CountDownLatch

[英]CountDownLatch in Android locking thread

我剛剛開始在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回調已成功命中,但是線程掛起了。

UPDATE我剛剛注意到,將CountDownLatch設置為0時,它將觸發onSuccess ,但是當我將其設置為大於0的任何值時,它將凍結並且永不調用onSuccess 似乎線程中有些時髦。

您的代碼太容易出錯,您需要在finally塊中調用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();
    }
});

抱歉,您的回答很晚,但是如果仍然對任何人有幫助:

您需要在單獨的線程中執行“ .await”,因為它會阻塞當前線程。

例:

final Handler mainThreadHandler = new Handler(Looper.getMainLooper());
new Thread(new Runnable() {
    @Override
    public void run() {
        allDoneSignal.await();
        mainThreadHandler.post(new Runnable() {
            doSomethingWhenAllDone();
        });
}
}).start()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM