以前に実装した一般的なタイプのカスタムリスナーに対して、奇妙なヌルポインター例外が発生しました。
アクティビティのメイン ユーザー インターフェイス スレッドと通信するコールバック メソッドにコードを入れると、クラッシュが発生します。ユーザー インターフェイス スレッドに触れないコードをこのメソッド内に配置すると、クラッシュは発生しません。このクラスのすべてのコードは 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;
}
}