0

以前に実装した一般的なタイプのカスタムリスナーに対して、奇妙なヌルポインター例外が発生しました。

アクティビティのメイン ユーザー インターフェイス スレッドと通信するコールバック メソッドにコードを入れると、クラッシュが発生します。ユーザー インターフェイス スレッドに触れないコードをこのメソッド内に配置すると、クラッシュは発生しません。このクラスのすべてのコードは UI スレッドで実行され、ハンドラーまたは runonui メソッドを使用する必要がないため、意味がありません。

この問題を解決するにはどうすればよいですか?

logcat から:

09-30 10:55:15.360: E/AndroidRuntime(2207): FATAL EXCEPTION: main
09-30 10:55:15.360: E/AndroidRuntime(2207): java.lang.NullPointerException
09-30 10:55:15.360: E/AndroidRuntime(2207):     at 
android.content.ContextWrapper.getResources(ContextWrapper.java:81)
09-30 10:55:15.360: E/AndroidRuntime(2207):     at android.widget.Toast.<init>(Toast.java:92)
09-30 10:55:15.360: E/AndroidRuntime(2207):     at android.widget.Toast.makeText(Toast.java:233)
09-30 10:55:15.360: E/AndroidRuntime(2207):     at StartActivity.onResultReturned(StartActivity.java:124)
09-30 10:55:15.360: E/AndroidRuntime(2207):     at jp.co.forever.tankinspectionsystem.Synchronizer.sendInt(Synchronizer.java:215)
09-30 10:55:15.360: E/AndroidRuntime(2207):     at 
jp.co.forever.tankinspectionsystem.Synchronizer$SendOutMsgAndPack$2.run(Synchronizer.java:162)

StartActivity クラスのリスナーのコード。これはアクティビティを拡張しないユーティリティ クラスであり、ここにあるすべてのコードは、UI スレッドとは別の新しいスレッド実行メソッドで実行されます。

クラス変数宣言で

 public OnResultReturnedListener listener;

作成中

 listener = new StartActivity();

リスナーは、このアクティビティ クラスのネストされたサブクラスとしてのインターフェイスです

 public interface OnResultReturnedListener {
public void  onResultReturned(int result);
 }

リスナーを実装する他のクラスのコード。すべてのコードは UI メイン スレッドで実行され、追加のスレッドは作成されません。

 public class StartActivity extends Activity
 implements Synchronizer.OnResultReturnedListener {

 // method onResultReturned is override for custom listerner class
 // OnResultReturnedListener interface inside of the Synchronizer class

    @Override
public void onResultReturned(int result) {

    // toast like this or any other method that touched the
    // UI thread will result in a crash
Toast.makeText(StartActivity.this, "value returned "
    + result , Toast.LENGTH_SHORT).show();


    // putting the Toast in a handler will not help, still results in crash
    handler.post(new Runnable() {
        @Override
        public void run() {
        Toast.makeText(StartActivity.this, "value returned "
                    + result, Toast.LENGTH_SHORT).show();
        }
        });

    //adding a handler.post to the other class, Synchronizer,
    // that the method call comes from
    // will not help and still causes crashes, for example
    //handler.post(new Runnable() {
    //@Override
    //public void run() {
    //fileTransferStatus = 1;
    //        listener.onResultReturned(fileTransferStatus);
    //   }
    //});

    // this statement will not cause crash
    int x = 13;
    }
 }
4

1 に答える 1