ブロードキャスト受信者(BroadcastReceiver)でUIをリフレッシュする方法
6477 ワード
学習android仲間は今日、自分が書いた放送受信者の中でuiを更新しようとした.
この問題は、進捗バーをトーストに変えてみんなができると信じて、onReceiveで直接判断すればいいのです
しかし、私たちがしたいのはトーストだけではありません.どうすればいいですか.安卓中のメッセージ伝達メカニズム、つまりHandlerを考えた学生がいます.いいですね.これはできます.そして、それがrunOnUIThreadという方法です.
直接使用する場合、MainActivity.this.runOnUIThreadは activityで静的クラスメンバー変数instance を作成 onCreateメソッドの最後に、thisをinstance に割り当てます.自分で静的メソッドgetInstance を書くブロードキャストでactivityを得るコンテキストは である.
添付:内部クラスを使用する場合、ブロードキャスト受信者をコードで登録すると、次のように実現できます.
参考:ブロードキャスト受信者によるUIの更新
参照:静的メソッドによるdialogの表示
この問題は、進捗バーをトーストに変えてみんなができると信じて、onReceiveで直接判断すればいいのです
if (intent.getAction().equals("DELIVERY_MESS_ACTION")) {
if (getResultCode() == -1) {
Toast.makeText(context, " ", 1).show();
} else if (getResultCode() == 0) {
Toast.makeText(context, " ", 1).show();
}
}
しかし、私たちがしたいのはトーストだけではありません.どうすればいいですか.安卓中のメッセージ伝達メカニズム、つまりHandlerを考えた学生がいます.いいですね.これはできます.そして、それがrunOnUIThreadという方法です.
直接使用する場合、MainActivity.this.runOnUIThreadは
""No enclosing instance of the type MainActivity is accessible in scope" "
の問題を引き起こします.これはMainActivityが内部クラスではないため、どのように解決しますか?私たちは今ラジオでactivityのコンテキストを手に入れたいと思っています.これはこの問題の鍵です.activityは私たちのnewではないので、そうすることができます.if (intent.getAction().equals("DELIVERY_MESS_ACTION")) {
if (getResultCode() == -1) {
// Toast.makeText(context, " ", 1).show();
MessSendActivity.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// Toast.makeText(MessSendActivity.getInstance(),
// "from messSend", 1).show();
ProgressBar pb = (ProgressBar) MessSendActivity
.getInstance().findViewById(R.id.pb);
pb.setVisibility(View.INVISIBLE);
}
});
} else if (getResultCode() == 0) {
Toast.makeText(context, " ", 1).show();
}
}
添付:内部クラスを使用する場合、ブロードキャスト受信者をコードで登録すると、次のように実現できます.
public class MainActivity extends Activity {
private MyReceiver receiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
receiver = new MyReceiver(new Handler()); // Create the receiver
registerReceiver(receiver, new IntentFilter("some.action")); // Register receiver
sendBroadcast(new Intent("some.action")); // Send an example Intent
}
public static class MyReceiver extends BroadcastReceiver {
private final Handler handler; // Handler used to execute code on the UI thread
public MyReceiver(Handler handler) {
this.handler = handler;
}
@Override
public void onReceive(final Context context, Intent intent) {
// Post the UI updating code to our Handler
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "Toast from broadcast receiver", Toast.LENGTH_SHORT).show();
}
});
}
}
}
参考:ブロードキャスト受信者によるUIの更新
参照:静的メソッドによるdialogの表示