ちょっとした説明、必要なこと: アクティビティの UI を別のスレッドから更新する必要があります。しかし、そのスレッドからアクセスできない非静的関数/ボリューム、静的のない bcs から、PhonePadActivity.uaReceiverHandler(msg) の方法で外部クラスからコードを呼び出すことはできません (また、そのスレッドからアクティビティへの静的参照 - PhonePadActivity.phonePadActivity は常に null であり、原因となります例外) 。しかし、静的ハンドラーを使用するために渡したとき、すべての静的参照も常に null であり、UI を更新する可能性はありません (単純な findViewByID 製品コンパイラ エラーは非静的から静的メソッドを参照できません)。したがって、別のスレッドが動作している PhonePadActivity.uaReceiverHandler(msg) のみがローカルのプライベート静的変数を変更できますが、ビュー オブジェクトにはアクセスできません) どうすれば解決できますか?
私はハンドルメッセージでよくメッセージを受け取ります:
public static final Handler uaReceiverHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
Bundle b = msg.getData();
Log.e(THIS_FILE, "WAS regState" + regState);
regState = b.getString("regState");
TextView statusLocal = (TextView) phonePadForUsing.findViewById(R.id.registrationStatus);
statusLocal.setText("Registered");
}
};
私の場合:
public class PhonePadActivity extends Activity {
public static PhonePadActivity phonePadForUsing;
private static TextView status;
割り当てたもの:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_phone_pad);
phonePadForUsing = this;
status = ((TextView) phonePadForUsing.findViewById(R.id.registrationStatus));
このコードは正常に機能し、regState も割り当てられますが、phonePadForUsing は常に null の免除を返します。このコードは次のとおりです。
status.setText("Registered");
完全なトレースを返します:
10-05 13:34:51.495: E/AndroidRuntime(12744): java.lang.NullPointerException 10-05 13:34:51.495: E/AndroidRuntime(12744): com.callsfreecalls.android.PhonePadActivity$4.handleMessage(PhonePadActivity で.java:1180) 10-05 13:34:51.495: E/AndroidRuntime(12744): android.os.Handler.dispatchMessage(Handler.java:99) 10-05 13:34:51.495: E/AndroidRuntime(12744) ): android.os.Looper.loop(Looper.java:123) 10-05 13:34:51.495: E/AndroidRuntime(12744): android.app.ActivityThread.main(ActivityThread.java:4627) 10- 05 13:34:51.495: E/AndroidRuntime(12744): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 10-05 13:34:51.495: E/AndroidRuntime(12744): java.lang.reflect で.Method.invoke(Method.java:521) 10-05 13:34:51.495: E/AndroidRuntime(12744): com.android.internal.os.ZygoteInit$MethodAndArgsCaller で。実行 (ZygoteInit.java:868) 10-05 13:34:51.495: E/AndroidRuntime(12744): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 10-05 13:34: 51.495: E/AndroidRuntime(12744): dalvik.system.NativeStart.main(ネイティブ メソッド) で
onCreate は以前に起動されたので、すべての要素は既に完了しています。bcs は OnCreate にログインしています (ご覧のとおり、例外より 10 秒早く...:
10-05 13:34:41.535: D/PhonePad(12735): onCreate: 作成されました
コードの平和も含めてください。別のクラスから使用する別のハンドラから同じコードがうまく機能します:
final static Handler clientControllerHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
final TextView status = ((TextView) phonePadForUsing.findViewById(R.id.registrationStatus));
status.setText("Data not received");