2015-01-14 56 views
0

在android中有一個活動(主活動)調用另一個類(而不是活動)來執行某些操作。該類啓動一個線程從服務器下載數據。下載完成後,我可以發送一條消息告訴主Activity類別做其他事情嗎?我正在查看處理程序,但處理程序需要在同一個類中定義。還有什麼我失蹤的?線程完成後可以讓其他課程知道嗎?

編輯: 謝謝..但我的問題是線程是從其他類開始的。該場景是我的活動綁定到服務並且正在接收消息。我將消息發送給處理消息的處理器類。我回復並回復併發送新的請求。現在,我需要從服務器(在另一個類中)獲取數據,然後下載它,我需要發送響應。

+0

活動不應當積極地與彼此交互。你應該使用一個片段作爲「另一個可以做某事的類」。 – Simas

+0

閱讀關於觀察者模式,這是一個常見的'問題' –

+0

使用asynctask http://developer.android.com/reference/android/os/AsyncTask.html – samleighton87

回答

0

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

如果AsyncTask不是您要查找的內容(例如,下載需要太多時間,您希望讓線程繼續在後臺運行等),並且所有您想要執行的操作都是GUI,你可以在線程上使用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(或任何其他類爲此事)實現此接口,並使用DownloadFinishedCallback引用,而不是一個的一個在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(); 
    } 
} 
+0

謝謝,我編輯我的問題,但如果它是接口或回調,我感到震驚? – JourneyWithAndroid

+0

如果線程從一個類或另一個類啓動,則無關緊要。一個接口可以是一個回調,它們是不同的概念。 – m0skit0

+0

@JourneyWithAndroid更新了我的答案。 – m0skit0

0

是的,您可以使用在UI線程中創建的Handler並從工作線程向其發佈消息。

更通用的解決方案是使用事件總線,如Otto或GreenRobot,它可以處理應用程序中的所有消息。我詳細地寫了a blog post這件事。

+0

我不認爲這是'Handler'的預期用法: *「處理程序有兩個主要用途:(1)安排將來要執行的消息和可運行列表;以及(2)排隊要在與您自己的」*「不同的線程上執行的操作。在OP的情況下(也可以在你的博客文章中),你沒有任何一種情況。您只需要在線程完成後完成操作。一個簡單的回調就足夠了。在我的經驗中,使用'Handler'的速度也明顯較慢。 – m0skit0

相關問題