繁体   English   中英

NullPointerExceptoin从活动向广播接收器传递值时

[英]NullPointerExceptoin when passing value from activity to broadcast receiver

我有一个简单的问题。

我已经在主要活动中声明了文本视图,并从XML( findViewById )创建了它。 我想将此值传递给广播接收器的子类。 以下是我的Broadcast构造函数:

public Broadcast(TextView text_dBm) {   
    this.text_dBm = text_dBm;   
}

在我的主要活动中,我创建一个新的广播对象,并在其中传递我的textview值,如下所示:

new Broadcast(text_dBm);

但是我的text_dBm仍然出现空指针异常。 无论如何(除了静态方法之外)是否有在活动和广播接收者之间传递值的方法?

哦,是的。 我的广播接收器已通过编程方式注册(在使用中),并且运行良好。

感谢您的时间!

PS: 我已经在SO中检查了一些线程,但是没有找到答案: 如何通过广播接收器中的活动传递值?

主要活动类别:

public class MainActivity extends Activity {
    TextView text_dBm, text_time, text_rssi;
    Intent startServiceFromActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text_dBm = (TextView) findViewById(R.id.textView_dBm);

        new Broadcast(text_dBm);
        startServiceFromActivity = new Intent(this, WifiService.class);
        startService(startServiceFromActivity); 
    }
}

广播接收器类别:

public class Broadcast extends BroadcastReceiver {
    WifiInfo wifiInfo;
    WifiManager wifiManager_service;
    TextView text_dBm;

    public Broadcast(WifiManager wifiManager_service) { 
        this.wifiManager_service = wifiManager_service; 
    }

    public Broadcast(TextView text_dBm) {       
        this.text_dBm = text_dBm;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("RECEIVER", "Receiver running"); // LOG   

        text_dBm.setText("textview"); // nullpointerexception
    }
}

通过意图传递数据

活动-

Intent i = new Intent(Activity.this, Broadcast.class);
Bundle b = new Bundle();
b.putString("key", "value");
i.putExtras(b);
startActivity(i);

在广播接收器类中的onReceive方法

@Override
public void onReceive(Context context, Intent intent) 
{
    String result = intent.getString("key");
    // your method
}

您无法使用Intent传递视图。 要执行您想做的事情,您将需要广播接收器成为您活动的内在类。 当活动开始未注册的活动时停止接收器应当予以登记。 否则,您将泄漏内存。 这意味着您仅在实际处于活动屏幕本身时才能接收消息。

如果您需要能够在活动之外接收广播,则需要:

  1. 在清单中为给定的操作(或在服务中注册您的接收者),但是不要忘记注销它
  2. 开始活动并传递消息以使用额外的意图在textview中显示
  3. 活动开始时,请检查该意图是否包含任何要在文本视图中显示的内容,并进行必要的操作

根据您的评论:

  1. 将接收器创建为活动的内部类(不是静态的接收器,因此它可以访问活动的TextView实例)
  2. 在onStart中注册接收器
  3. 在onStop中注销接收器
  4. 在接收器的onReceive方法中执行:textView.setText(intent.getStringExtra(“ dbm”));
  5. 服务通过传递额外的意向“ dbm”并包含要显示的文本来发送广播

-

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    dbmView = (TextView) findViewById(R.id.textView_dBm);
  }

  @Override
  protected void onStart() {
    super.onStart();
    IntentFilter intentFilter = new IntentFilter("com.example.broadcasts.DBM_UPDATE");
    registerReceiver(receiver, intentFilter);
  }

  @Override
  protected void onStop() {
    unregisterReceiver(receiver);
    super.onStop();
  }

  private TextView dbmView;

  private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        dbmView.setText(intent.getStringExtra("dbm"));
    }
  }

}

在服务中:

Intent i = new Intent("com.example.broadcasts.DBM_UPDATE");
i.putExtra("dbm", "it works!");
sendBroadcast(i);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM