web-dev-qa-db-ja.com

android-ワーカースレッドから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));
    }
}
_

allActivity私のアプリのクラスは単純になりました

_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私に、それは私を泣かせています-私は何を間違っていますか?

:編集:

「なぜ」このタイプの実装にこだわっているのかを説明する背景。

「HTTP POST」イベントが成功したことをユーザーに確認できる必要があります。今。ユーザーがUIフォームで[OK]をクリックすると、その時点でインターネットがある場合とない場合があります。インターネットがある場合-すべてが順調で、HTTP POST- すべて順調 ..ただしNOインターネットほとんど(99.999%of Androidアプリがラメ/哀れ/これでうろつく、基本的にユーザーに提供しないplan "b"インターネットは常に存在すると仮定します-存在しない場合)

私のアプリは「ラメになりません」と呼ばれます-plan "b"があり、代わりにpostイベントを「キュー」に入れ、x分ごとに再試行します。バックグラウンドでのスレッド。アプリ全体でユーザーとのやり取りがたくさんあります。ユーザーが「どこに」いるのかわかりませんが、最終的にHTTP POST that queue/retries/queue/retriesは "!Success!"を返します。ユーザーへのメッセージとしてToastしたい(例: "フォームが送信されました")

18
conners

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();
    }
});
53
Rawkode

以下のコードを使用してください。アクティビティインスタンスを含むアクティビティオブジェクトを作成します。

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

これにより、コンテキストを使用してトーストを起動する必要なく、メッセージ自体を表示するときに参照するだけで、メッセージを表示できます。

runOnUiThreadはOpenGL Viewスレッドから機能していなかったため、これが解決策でした。それが役に立てば幸い。

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

getThread()の結果をMyActivity基本クラスのインスタンスにキャストすることはできません。 getThread()は、Threadとは関係のないActivityを返します。

あなたがやりたいことをする素晴らしい方法はありません。ある時点で、「ワーカースレッド」抽象化には、Toastを作成できるものへの参照が必要になります。 Activityサブクラスへの参照を含むいくつかの静的変数を保存して、単にToast作成をショートカットできるようにすることは、メモリリークと痛みのレシピです。

2
Brian Dupuis

BroadCastReceiverによってキャプチャされたインテントを送信しないと、ブロードキャストレシーバーは通知トレイに通知を作成できます。これは乾杯ではありませんが、投稿が成功したことをユーザーに知らせる方法です。

1
fernandohur

自分のアクティビティ内にある場合、なぜdoToast()を呼び出せないのですか?

0
Karakuri

コンテキストがある場合は、非アクティビティクラスからこのようなUIスレッドを呼び出すことができます。

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