簡體   English   中英

Java中線程之間的異步通信

[英]Asynchronous communication between threads in Java

后台:我正在從事Android開發。
嘗試制作一個從遠程http服務器獲取一些數據的應用程序。
Android系統要求http請求必須在單獨的線程中完成。

因此,我有一個主線程,其中發生了一些UI交互,第二個線程(實現Runnable接口)發出了HTTP請求。 第二個線程中有兩種可能的情況:

  • 一切正常,我得到了有效的回應
  • 發生了一些錯誤,我想通知我有關它的主線程

所以問題是:
在線程之間異步通信的最佳實踐是什么?
我無法暫停(睡眠,等待)主線程,因為用戶應該可以與UI進行交互。

謝謝

UPD
重要的是“ Android”只是測試的地方。
我想使用“本地” Java庫/類/來實現結果。

有很多方法可以做到這一點。 我通常這樣做(在MainActivity中):

public void notification(final int title, final int message, final int duration) {
    runOnUiThread(new Runnable() {
        public void run() {
            Toast.makeText(MainActivity.this, message, duration).show();
        }
    });
}

此示例僅通知用戶,但您可以添加或更改run()的內容。
編輯
根據runOnUiThread()上的文檔,這是一種旨在在UI線程上運行代碼段的方法。 這意味着您可以從任何線程安全地調用它。 您唯一需要考慮的就是在線程中擁有mainActivity引用。

編輯2
如果要使用純Java進行操作,請使用同步方法安全地訪問對象的內容,例如:

public class YourClassWithSychMethod {
    private int i;

    public synchronized void set(int val) {
        i=val;
    }

    public synchronized int get() {
        return i;
    }
}

這意味着您可以從任何線程調用這些方法。 它可能不是專門的課程,而是您的任何課程。
因此, 場景如下:
-線程A調用set() ,因此將某些事件通知線程B
-線程循環中的踩B調用get()來檢查是否滿足所需條件並做出相應反應。 請注意,線程B可以不使用線程循環,而可以使用任何其他循環,計時器等。
編輯3
您還可以將消息發送到您的UI線程,如docs中所述或例如此處

PS HTTP請求怎么樣-我對AsyncHttpClient (或者與之對應的SyncHttpClient感到非常滿意,如果您不僅需要將http請求,而且所有相關工作都移到非UI線程中)。 該庫解決了線程和http通信處理方面的許多麻煩

在主線程中使用YourThread.join()。 這將停止主線程的工作,直到您從YourThread獲得響應。 而且,您可以根據YourThread的響應來決定顯示給用戶/程序流的響應。

同時,在主線程工作時,您向用戶展示祝酒詞,指出正在獲取HTTP信息。

暫無
暫無

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

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