22

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てくれず、泣きそうになることです。何が間違っているのでしょうか?

: 編集 :

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

「HTTP POST」イベントが成功したことをユーザーに確認できるようにする必要があります。今。ユーザーが UI フォームで [OK] をクリックすると、その時点でインターネットが接続されている場合と接続されていない場合がありますインターネットはほとんどありません (Android アプリの 99.999% は、これに不自由な / 哀れな / 鳴き声を上げており、基本的に、インターネットが常に存在することを前提として、プラン "b"をユーザーに提供していません)。

私のアプリは「(私が呼んでいるように)ラメになる」ことはありません-代わりにプラン「b」があり、ポストイベントを「キューに入れ」、x分ごとに再試行します..今、これはバックグラウンドでサイレントスレッドです..私アプリ全体で多くのユーザー インタラクションがある ユーザーがどこに「いる」かはわかりませんが、最終的には、キュー/再試行/キュー/再試行する HTTP POST が「! 成功!」 を返すときToastに、ユーザー (例: 「フォームが送信されました」)

4

7 に答える 7

58

何が問題なの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();
    }
});
于 2012-12-06T15:31:51.307 に答える
6

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

activity.runOnUiThread(new Runnable() {
  public void run() {
    Toast.makeText(activity.getApplicationContext(),"Toast text",Toast.LENGTH_SHORT).show();
  }
);
于 2012-12-06T15:38:49.497 に答える
2

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

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

于 2012-12-06T15:42:21.633 に答える
1

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

于 2013-05-25T05:08:05.213 に答える
0

それがあなた自身の活動の範囲内にある場合、なぜあなたは単に電話できないのですdoToast()か?

于 2012-12-06T15:44:09.583 に答える