2013-02-06 49 views
0

我有一個簡單的問題。NullPointerExceptoin當從活動傳遞價值到廣播接收器

我已經在主要活動中聲明瞭文本視圖,並從XML創建了它(findViewById)。我想將此值傳遞給廣播接收器的子類。以下是我的廣播構造:

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

在我的主要活動我創建了一個新的廣播對象,並通過在我的價值TextView的,就像這樣:

new Broadcast(text_dBm); 

但我仍然獲得空指針異常我的text_dBm。無論如何(除了靜態方法)在活動和廣播接收器之間傳遞值嗎?

哦,是的。我的廣播接收機以編程方式註冊(服務中),並且它的運行非常完美。

謝謝你的時間!

PS:我已經查了一些線程這裏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 
    } 
} 
+0

發表您的這裏的代碼 – Prachi

+0

我做了,請看看它:) – rootpanthera

+0

你確定你有一個有效的viewId?根據文檔,如果沒有找到視圖,'findViewById(int)'將返回null。 – Alderath

回答

2

使用意圖不能繞過的意見。要做你想做的事,你需要你的廣播接收器成爲你的活動的內部類。當活動開始時,接收者應該註冊當活動停止時,未註冊。否則你會泄漏內存。這意味着您只能在活動屏幕上實際收到您的消息。

如果您需要能夠接收活動外廣播,你將需要:

  1. 註冊您的接收器在清單中的規定動作(或服務,但不要忘了取消註冊)
  2. 啓動活動,並通過使用活動開始時的意圖額外
  3. 消息中的TextView中顯示,請檢查是否意圖包含任何在TextView的顯示和做必要的

從您的評論:

  1. 創建接收器作爲一個內部類的活動(而不是靜態的,因此它可以訪問活動的TextView的實例)
  2. 處理通信
  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); 
+0

很好的答案!你已經清除了我腦海中的一些東西。事情是我有一個服務和代碼(sendBroadcast(intent))在服務運行每X秒。 實際上,程序正在做什麼,每X秒更新一次RSSI信號。我正在做這個是廣播接收器。如果活動是可見的,那麼我需要每次onReceive()運行時更新textview。 關於那個2.回答。你的意思是「使用intent extra傳遞消息在textview中顯示」? – rootpanthera

+0

見編輯帖子 –

+0

美麗!!!!!!! –

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

這是否也適用於對象,如Views ..etc?因爲我需要將textView對象傳遞給Broadcast receiver。 – rootpanthera

+0

它正在爲實現Parcelable接口的對象工作。並且可序列化。視圖不會實現這些接口。 –

+0

我問過如何傳遞textview對象(視圖)。努努的回答對我的情況來說是不正確的。 – rootpanthera