【问题标题】:NullPointerExceptoin when passing value from activity to broadcast receiver将值从活动传递到广播接收器时出现 NullPointerExceptoin
【发布时间】:2013-02-06 21:46:32
【问题描述】:

我有一个简单的问题。

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

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

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

new Broadcast(text_dBm);

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

哦,是的。我的广播接收器以编程方式注册(在服务中),并且运行良好。

感谢您的宝贵时间!

P.S:我已经在 SO 中检查了一些线程,但我没有找到答案: How to pass value from an activity in an broadcast receiver?

主要活动类:

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
    }
}

【问题讨论】:

  • 我做了,请看:)
  • 你确定你有一个有效的viewId吗?根据文档,如果没有找到视图,findViewById(int) 将返回 null。
  • 查看 100% 有效。检查了 3 次。
  • 基本上你只是想改变settext的值吧???
  • 是的。从广播接收器。由于广播接收器在 UI 线程中运行,这是可能的,但我不知道如何将在主活动中创建的值引用到广播接收器

标签: java android android-activity broadcastreceiver


【解决方案1】:

您不能使用 Intent 传递视图。为了做你想做的事,你需要你的广播接收器成为你活动的内部类。接收器应该在活动开始时注册在活动停止时取消注册。否则你会泄漏内存。这意味着您只能在实际在活动屏幕本身上接收消息。

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

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

来自您的评论:

  1. 将接收器创建为 Activity 的内部类(不是静态的,因此它可以访问 Activity 的 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);

【讨论】:

  • 好答案!你已经清除了我脑海中的一些东西。问题是我有一个服务和代码(sendBroadcast(intent))在服务中每X秒运行一次。实际上程序正在做的是每 X 秒更新一次 RSSI 信号。我正在做的是广播接收器。如果活动可见,那么我需要在每次 onReceive () 运行时更新 textview。关于那个 2. 回答。你的意思是“使用额外的意图传递消息以在文本视图中显示”?
【解决方案2】:

通过意图传递数据

活动 -

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
}

【讨论】:

  • 这是否也适用于对象,例如 Views ..etc ?因为我需要将 textView 对象传递给广播接收器..
  • 它适用于实现 Parcelable 接口的对象。并且也是可序列化的。视图不实现这些接口。
  • 我问过如何传递 textview 对象(视图)。努努的回答不适合我的情况。
猜你喜欢
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多