2012-12-06 128 views
18

嗨調用UI線程我要讓Toast提供給我無事,什麼,可從每當我喜歡我的應用程序中的任何線程。因此,要做到這一點,我擴展了Activity類:機器人 - 從工作線程

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.widget.Toast; 

public class MyActivity extends Activity{ 
    private Handler mHandler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) {  
     mHandler = new Handler(); 
     super.onCreate(savedInstanceState); 
    } 

    private class ToastRunnable implements Runnable { 
     String mText; 

     public ToastRunnable(String text) { 
      mText = text; 
     } 

     public void run(){ 
      Toast.makeText(getApplicationContext(), mText, Toast.LENGTH_SHORT).show(); 
     } 
    } 

    public void doToast(String msg) { 
     mHandler.post(new ToastRunnable(msg)); 
    } 
} 

使所有Activity類在我的應用程序,現在只是

public class AppMain extends MyActivity { 
    //blah 
} 

什麼,我希望能夠做到(在輔助線程)是這樣的:

try{ 
    MyActivity me = (MyActivity) Looper.getMainLooper().getThread(); 
    me.doToast("Hello World"); 
} 
catch (Exception ex){ 
    Log.e("oh dear", ex.getMessage()); 
} 

,因此只要Activity是「MyActivity」它應該工作 - 但問題是--->Looper.getMainLooper().getThread();沒有返回MyActivity給我,它讓我哭了 - 我做錯了什麼?

:編輯:

一些背景來解釋 「爲什麼」 我堅持這種類型implmentation的。

我需要能夠確認到,一個「HTTP POST」事件已經是成功的用戶。現在。如果用戶點擊UI「OK」的形式,它可能或不可能有互聯網在那個時候..如果有互聯網 - 一切都很好 - 它通過HTTP POST 職位形式都很好 ..但如果有大多數(99.999%的Android應用程序跛腳/可憐/喵喵在此,基本上提供用戶沒有計劃「b」假設在任何時候都有互聯網 - 當它不是)

我的應用程序不會「走瘸(我稱之爲)」 - 它確實有一個計劃「b」而是「隊列」的帖子事件和重試每隔x分鐘。現在這是一種無聲的線程中背景..我有很多用戶交互的應用程序,我不知道用戶在哪裏將「成爲」,但最終當隊列/重試/隊列/重試的HTTP POST返回「!成功! 「我想Toast,作爲一個消息給用戶(例如:‘你的形式發送’)

回答

50

這有什麼錯runOnUiThread

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)下面的代碼

activity.runOnUiThread(new Runnable() { 
    public void run() { 
     Toast.makeText(activity, "Hello, world!", Toast.LENGTH_SHORT).show(); 
    } 
}); 
+0

不,我要發佈'Toast'消息給用戶,'runOnUiThread'接受'的Runnable Action'其中'Toast'不 – conners

+0

工作沒有'activity'因爲沒有'上下文' – conners

+1

爲什麼不使用'getApplicationContext()'? – Rawkode

6

使用創建活動?對象,其中包含您的活動實例..

activity.runOnUiThread(new Runnable() { 
    public void run() { 
    Toast.makeText(activity.getApplicationContext(),"Toast text",Toast.LENGTH_SHORT).show(); 
    } 
); 
+0

我在'worker'線程中沒有'activity'(它不可作爲參數,因爲工作人員永遠試圖連接到服務器發送消息..然後活動調用然後關閉自己..我需要從服務器確認並確認事件發生後,一旦發生,所有我需要的是Android將當前的ui線程作爲Activity來咳嗽 – conners

+0

如果您無法將活動引用傳遞給工作線程,則很明顯,廣告設計是問題的根源。您應該能夠在創建線程時傳遞參考,而不是暗示線程實體化。 – LoungeKatt

2

你不能只投中getThread()結果到instanc e的MyActivity基類。 getThread()返回Thread,它與Activity無關。

有沒有偉大的 - 閱讀:清潔 - 做你想做的事情的方式。在某些時候,你的「工作者線程」抽象將不得不引用一些可以爲你創建Toast的東西。保存一些包含對Activity子類的引用的靜態變量只是爲了能夠快捷地創建Toast,這是內存泄漏和痛苦的祕訣。

+0

我沒有使用靜態類,它是'Activity'包含'Handler'的基本擴展。我想讓Android做的是咳嗽當前活動。 – conners

+1

@conners:這並不改變「 getThread()'返回一個'Thread',它不是'Activity',更不用說'MyActivity'。 – CommonsWare

+0

我同意,但必須有一種方法,就Android讓我在SDK中,「Activity」是UI線程的前面。我不確定爲什麼沒有'Looper.getMainLooper() .getThread()。getActivity()/ .getContext()'說實話..我期待着有一個。大多數解決方案都要求您將上下文作爲參數傳遞 - 但如果您不知道它是什麼上下文,或者如果它是稱爲工作人員的表單關閉事件(與我的情況相同),該怎麼辦? – conners

0

如果它在你自己的活動範圍內,爲什麼你不能只打doToast()

1

爲什麼不發送由BroadCastReceiver捕獲的意圖,然後廣播接收器可以在通知托盤中創建通知。這不是敬酒,而是通知用戶他的帖子已經成功的一種方式。

4

這將允許您顯示消息,而不需要依賴上下文來啓動吐司,僅在顯示消息本身時才引用。

runOnUiThread不能從OpenGL視圖線程工作,這是解決方案。希望能幫助到你。

private Handler handler = new Handler(); 
handler.post(new Runnable() { 
    public void run() { 
     Toast.makeText(activity, "Hello, world!", Toast.LENGTH_SHORT).show(); 
    } 
}); 
1

如果你有你的上下文,你可以像這樣從非activity類調用ui線程。

((Activity)context).runOnUiThread(new Runnable() { 
    public void run() { 
     // things need to work on ui thread 
    } 
});