簡體   English   中英

android - 從工作線程調用ui線程

[英]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()的結果MyActivityMyActivity基類的實例。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM