2015-04-02 42 views
2

我有MainActivity和我的單獨班級,名字是MyClass。我想在MyClass中運行一些代碼。我在MyClass有這方法。在MyClass的構造函數中,我通過ContextMainActivity類,並將其轉換爲ActivityContextAndroid - 從UI線程切換回來?

MyClass.java

private Context context; 
    private Activity activity; 

    public MyClass(Context context) { 
     this.context = context; 
     this.activity = (Activity) context; 
    } 

    public void MyFunction() { 
    activity.runOnUiThread(new Runnable() { 
     public void run() { 

      // Code 
     } 
    }); 
    } 

一切都很精細還在這裏。在runOnUiThread中,我寫了一些代碼。有一種情況,在執行runOnUiThread()正文後,我想回到MyClass上下文。我只想在runOnUiThread()中完成此操作。有什麼方法可以再次切換回當前線程?

感謝

+0

_I想再次切換到當前thread_這意味着在UI線程運行後,你想回到MyClass的背景? – Kushal 2015-04-02 04:16:18

+0

是的正確...! – 2015-04-02 04:18:40

+1

如果不在單獨的Thread中使用'MyClass'類,那麼不需要使用'runOnUiThread',因爲所有代碼都在同一線程上運行 – 2015-04-02 04:19:43

回答

1

我從問題得到的是,你需要在UI線程中運行一些代碼,並在後臺線程中運行一些代碼。我是的,你可以修改MyClass使用Handler如下。

private Context context; 
private Handler backgroundHandler; 
private Handler uiHandler; 

public MyClass(Context context, Handler handler) { 
    this.context = context; 
    // this.activity = (Activity) context; 
    this.uiHandler = handler; 

    HandlerThread handlerThread = new HandlerThread("MyClass.Handler"); 
    handlerThread.start(); 
    backgroundHandler = new Handler(handlerThread.getLooper()); 
} 

public void MyFunction() { 
    uiHandler.post(new Runnable() { 
     public void run() { 

      // Code to execute on ui thread 

      backgroundHandler.post(new Runnable() { 
       public void run() { 
        // Code to execute on bg thread 
       } 
      });   
     } 
    }); 
} 

傳遞Handler爲:

MyClass myClass = new MyClass(context, new Handler()); 
+0

中所解釋的那樣...!非常感謝 – 2015-04-02 05:47:40

1

一旦從runOnUiThread()訪問API進行PubNub,Android系統會自動將處理切換到當前線程並執行外的語句:如果定義

public void MyFunction() { 
    activity.runOnUiThread(new Runnable() { 
     public void run() { 

      // Code which runs on MAIN UI thread 
     } 
    }); 
    // once upper part is done, switching to current thread 
    // these statements will be execute on current thread 
    // statement 1; 
    // ... 
    } 
+0

我想切換回runOnUiThread塊中的當前線程 – 2015-04-02 04:28:05

+0

爲什麼你想這樣做明確。如果你執行'runOnUiThread()'部分的所有代碼並且什麼都不做,那麼android系統會自動在當前線程的後面部分執行。所以,無論你想從'runOnUiThread()'部分調用,這個調用可以從外部進行,正如我在回答 – Kushal 2015-04-02 04:31:07

1

,並實現自定義類活動類,除非您創建一個新線程,否則您的所有代碼都將在UI線程中運行。

runOnUiThread方法傳遞需要有一個不同的線程引用UI線程用於更新視圖或其他UI組件中的信息。

要在原始類中運行代碼,您應該執行一些操作。首先,你應該將它定義爲一個單獨的類(在另一個文件中,而不是私有類)。

其次,您應該將它傳遞給Activity(可能爲WeakReference),然後在必要時使用Activity方法「runOnUiThread」。

另一種選擇是創建一個HandlerThread以在您希望運行UI時運行。

你是不是你的用例完全清楚......

2

您可以使用發佈的ρяσѕρєяK或Kushal的答案之一。這是我的2美分讓事情變得清晰。

內部runOnUiThread所有的代碼將在UI線程被執行,並且它不能被分成兩個部分;一個在UI線程上運行,另一個在另一個線程/上下文中運行。現在,如果你想後runOnUiThread完成執行的代碼塊,那麼你可以如下修改runOnUiThread功能(如建議在一些問題的答案在這裏):

public void MyFunction() { 
    activity.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      // Add code to run on UI-Thread here 
     } 
    }); 
    // Add code to run on non UI-Thread here (i.e. on the calling Thread) 
}