簡體   English   中英

一類的線程完成后可以讓另一類知道嗎?

[英]Thread in one class on completed can it let another class know about it?

在android中有一個活動(Main Activity),該活動調用另一個類(不是活動)來做某事。 此類啟動線程以從服務器下載數據。 下載完成后,我可以發送一條消息告訴主Activity類做其他事情嗎? 我正在查看處理程序,但隨后需要在同一類中定義處理程序。 還有其他我想念的東西嗎?

編輯:謝謝..但是我的問題是線程是從另一個類啟動的。 場景是我有綁定到服務並正在接收消息的活動。 我將消息發送到處理該消息的處理器類。 我返回一個響應並發送新請求。 現在,對於其中一條消息,我需要從服務器(在另一個類中)獲取數據,並在下載消息時發送響應。

是的,您可以使用在您的UI線程中創建的Handler程序,並通過工作線程將消息發布到該處理程序。

更通用的解決方案是使用事件總線,例如Otto或GreenRobot,它們可以處理應用程序中的所有消息傳遞。 我寫了一篇關於此的博客文章

我建議您使用AsyncTask因為這是它的目的,而不是自己嘗試做。

如果不是您想要的AsyncTask (例如,下載花費了太多時間,您想讓線程在后台運行,等等...),而您要做的就是GUI,您可以使用runOnUIThread上的runOnUIThread

如果以前的解決方案不可行,則可以執行以下操作:

public class MainActivity extends Activity {

    private void startDownload() {
        // Start your thread passing this activity reference for example:
       YourThreadStartClass.startThreadedJob(this);
    }

    public void onDownloadFinish() {
         // Do your stuff on MainActivity after the download has finished
    }
}

public class YourThreadStartClass {
    public static void startThreadedJob(final MainActivity callback) {
        new Thread(new YourRunnable(callback)).start();
    }
}


// This is the Runnable your thread will be running
public class YourRunnable implements Runnable {

    private final MainActivity callback;

    public YourRunnable(final MainActivity activity) {
        this.callback = activity;
    }

    @Override
    public void run() {
         // Do your stuff on this thread and when finished:    
         this.callback.onDownloadFinish();
    }
}

編輯:我已經簡化了一點,但是Java中執行此操作的實際正確方法是定義一個像

public interface DownloadFinishedCallback {
    void onDownloadFinish();
}

並使您的MainActivity (或與此有關的任何其他類)實現此接口,並在YourRunnable使用DownloadFinishedCallback引用而不是MainActivity YourRunnable

接口示例:

public interface DownloadFinishedCallback {
    void onDownloadFinish();
}

public class MainActivity extends Activity implements DownloadFinishedCallback {

    private void startDownload() {
        // Start your thread passing this activity reference for example:
        YourThreadStartClass.startThreadedJob(this);
    }

    @Override
    public void onDownloadFinish() {
        // Do your stuff on MainActivity after the download has finished
    }
}

public class YourThreadStartClass {
    public static void startThreadedJob(final DownloadFinishedCallback callback) {
        new Thread(new YourRunnable(callback));
    }
}

// This is the Runnable your thread will be running
public class YourRunnable implements Runnable {

    private final DownloadFinishedCallback callback;

    public YourRunnable(final DownloadFinishedCallback callback) {
        this.callback = callback;
    }

    @Override
    public void run() {
        // Do your stuff on this thread and when finished:
        this.callback.onDownloadFinish();
    }
}

暫無
暫無

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

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