[英]android - calling ui thread from worker thread
嗨,我想在我的應用程序中隨時隨地通過任何線程向我提供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表單上的“確定”它當時可能或者可能沒有互聯網..如果它有互聯網 - 一切都很好 - 它通過HTTP POST發布表格一切都很好 ......但是如果有的話沒有互聯網最多(99.999%的Android應用程序跛足/可憐/ mewling在這,並基本上提供用戶沒有計划“b”假設在任何時候互聯網都在那里 - 當它不是)
我的應用程序不會“跛腳(我稱之為)” - 它確實有一個計划“b”而不是“隊列”發布事件並重試每x分鍾..現在這是一個背景中的無聲線程..我在整個應用程序中有大量的用戶交互我不知道用戶將在哪里“但”最終當隊列/重試/隊列/重試的HTTP POST返回“!成功!”我想要作為消息Toast
用戶(EG:“您的表格已發送”)
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();
}
});
使用下面的代碼。 創建包含活動實例的活動對象。
activity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(activity.getApplicationContext(),"Toast text",Toast.LENGTH_SHORT).show();
}
);
這將允許您顯示消息,而無需依賴上下文來啟動Toast,僅在顯示消息本身時引用。
runOnUiThread無法在OpenGL View線程中運行,這就是解決方案。 希望能幫助到你。
private Handler handler = new Handler();
handler.post(new Runnable() {
public void run() {
Toast.makeText(activity, "Hello, world!", Toast.LENGTH_SHORT).show();
}
});
您不能只將getThread()
的結果MyActivity
為MyActivity
基類的實例。 getThread()
返回一個與Activity
無關的Thread
。
沒有偉大的閱讀:干凈 - 做你想做的事情的方式。 在某些時候,你的“工人線程”抽象必須引用一些可以為你創建Toast
的東西。 保存一些包含對Activity
子類的引用的靜態變量只是為了能夠快速創建Toast
是內存泄漏和痛苦的一個方法。
為什么不發送BroadCastReceiver捕獲的意圖,然后廣播接收器可以在通知托盤中創建通知。 這不是祝酒,而是告訴用戶他的帖子成功的一種方式。
如果它在你自己的活動中,為什么你不能只調用doToast()
?
如果你有上下文,你可以從非活動類調用這樣的ui線程。
((Activity)context).runOnUiThread(new Runnable() {
public void run() {
// things need to work on ui thread
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.