2011-11-24 57 views
1

我有Activity類,Controller類(正常的java類用來控制活動的數量)和BusinessEngine類(正常的java類用於處理數據)。回調其他類的活動

當我需要做的活動有一定的計算,Activity將調用ControllerController將調用BusinessEngine做計算。當BusinessEngine完成計算後,它會將值傳遞迴Controller,最後讓活動知道計算已完成。

問題是我如何從Controller類回調Activity?或者將任何數據傳遞給Activity並通知它數據已更改?

回答

0

你爲什麼要找控制器來打電話給你Activity?通常情況下,你必須活動通過它的方法調用控制器,並從中直接得到的結果:使用的是Android的AsyncTask

// Code in your Activity 
result = controller.doSomething(args); 
+0

如果按照你的建議,那麼我的活動將凍結,直到doSomething完成,即使我把一個線程doSomething;那麼我不會知道什麼時候結果可用,因爲我沒有回叫來通知我它已準備好使用。 –

+0

如果你的方法需要花費很多時間來執行,那麼你可以在你的Activity中使用AsyncTask來完成這項工作:http://developer.android.com/reference/android/os/AsyncTask.html – Hicham

0

試試,如果你的方法需要很長的時間來處理。 example

0

將您的類添加到異步任務中,或者如果您調用類並將它們從一個類傳遞到另一個類。我會說使用靜態類。並提供一些代碼,以便我們知道如何傳遞數據。

如果不使用通用方法來調用超類或子類。

我的答案有點抽象,因爲信息較少。

1

任何「長」運行任務必須在後臺線程中執行。我不確定你現在是否正在爲你的任務做這件事,所以如果你不是,那麼有幾種方法可以做到這一點。第一種方法是簡單地使用AsyncTask,第二種方法是創建自己的AbstractExecutorService(AsyncTask使用ThreadPoolExecutor)的實例並使用它將RunnableCallables發佈到。後面的方法可能會爲您節省很多重置因素,具體取決於您的代碼庫。

假設您現在在後臺線程中運行任務,有必要在UI線程上執行UI更新。還有幾種方法可以做到這一點。一種方法是將方法發佈到方法Activity#runOnUiThread,第二種方法是使用之前已在UI線程上創建的Handler(Activity#runOnUiThread在後臺執行)。所以,假設你的Activity有一個方法#postResults(final Object o),並且你的控制器有方法#doSomething(final Activity activity)。

你的活動看起來像這樣。

public class MyActivity extends Activity { 
    Controller controller = .... 
    ExecutorService service = Executors.newFixedThreadPool(10); 

    private void startTask() { 
     Runnable r = new Runnable() { 
      public void run() { 
       c.doSomething(MyActivity.this); 
      } 
     } 
     service.submit(r);   
    } 

    public void postResults(final Object o) { 
     Runnable r = new Runnable() { 
      public void run() { 
       // Update your UI here 
      } 
     } 
     runOnUiThread(r)  
    } 

} 

和控制器

public class Controller { 

    public void doSomething(final Activity activity) { 
     // Perform some long running task here 
     activity.postResults(someObject);  
    } 
} 

顯然這個例子可以收拾(例如通過一個接口DoSomething的,而不是活動),但希望它應該有足夠的瞭解你需要什麼做:)