0

ちょっとした説明、必要なこと: アクティビティの 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");
4

2 に答える 2

1

さて、まず、うまくいく方法で行ってください。通常、すべてのUI要素はonCreate()で初期化されます。次に、ハンドラーでアクセスします。

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");   
    //More this to onCreate(), make statusLocal a global variable.
    TextView statusLocal = (TextView) phonePadForUsing.findViewById(R.id.registrationStatus);  

    statusLocal.setText("Registered");  

}  };  
于 2012-10-05T10:19:08.130 に答える
0

あなたのスタックトラクトを調べてください:

PhonePadActivity.java:1180

null ポインター例外をスローします。これは、逆参照している変数が初期化されていないか、null であることを意味します。

コードを注意深く見ると、ハンドラーが静的クラスであることがわかります-したがって、元のインスタンスへの参照はありません-初期化した場合でも、参照はnullになる可能性があります。

この呼び出しの前にログ ステートメントを追加するだけで、何が起こるかを確認できます。

于 2012-10-05T11:25:18.467 に答える