2

私がやろうとしているのは、メインアクティビティへの参照を別のクラスに渡して使用することです。

私が最初に参照を渡すとき、それはnullではありません。しかし、後でイベントハンドラーで使用するとnullになります。

コードは次のとおりです。

public class MainActivity extends MapActivity implements SmsReceivedListener {
    SmsReceiver smsreceiver = new SmsReceiver();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        smsreceiver.setSmsReceivedListener(this);
    }

    public void drawme() {
        // do smth
    }

    @Override
    public void onSmsReceived(String id, String lon, String lat) {
        Toast.makeText(this, "SMS delivered", Toast.LENGTH_LONG).show();

    }
}

参照を取得する他のクラス:

public class SmsReceiver extends BroadcastReceiver {
    private SmsReceivedListener listener;
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

    @SuppressLint("NewApi") 
    @Override
    public void onReceive(final Context context, final Intent intent) {
        // Here it is NULL
        if(listener!=null)
            listener().onSmsReceived(carNumber, lon,lat);
    }

    public void setSmsReceivedListener(SmsReceivedListener mainActivity) {
        //It is no null when I first set the object here
        listener = (mainActivity);
    }
}
4

2 に答える 2

1

次の場合にのみ null になります。

  • nullに設定します
  • スレッドセーフではない方法で使用し、設定する別のスレッドで読み込んでいます
  • 同じフィールドを使用していますが、別のオブジェクトで使用しています。
于 2013-01-18T10:26:55.057 に答える
1

SmsReceiver を登録していないため、次のように推測します。

SmsReceiver はマニフェストに登録されます。したがって、ブロードキャストが検出されると、レシーバーのインスタンスがシステムによって作成されます。これは、ユーザーが作成したインスタンスとは異なります。

提案 : マニフェストではなく、アクティビティに受信者を登録します。

于 2013-01-18T10:38:41.403 に答える