こんにちは、私は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
したい(例: "フォームが送信されました")
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();
}
);
これにより、コンテキストを使用してトーストを起動する必要なく、メッセージ自体を表示するときに参照するだけで、メッセージを表示できます。
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
基本クラスのインスタンスにキャストすることはできません。 getThread()
は、Thread
とは関係のないActivity
を返します。
あなたがやりたいことをする素晴らしい方法はありません。ある時点で、「ワーカースレッド」抽象化には、Toast
を作成できるものへの参照が必要になります。 Activity
サブクラスへの参照を含むいくつかの静的変数を保存して、単にToast
作成をショートカットできるようにすることは、メモリリークと痛みのレシピです。
BroadCastReceiverによってキャプチャされたインテントを送信しないと、ブロードキャストレシーバーは通知トレイに通知を作成できます。これは乾杯ではありませんが、投稿が成功したことをユーザーに知らせる方法です。
自分のアクティビティ内にある場合、なぜdoToast()
を呼び出せないのですか?
コンテキストがある場合は、非アクティビティクラスからこのようなUIスレッドを呼び出すことができます。
((Activity)context).runOnUiThread(new Runnable() {
public void run() {
// things need to work on ui thread
}
});