2014-06-11 46 views
0

當我使用Toast消息時,它正在工作。現在當我用alert對話框替換它時,我得到了運行時異常。這裏是我的代碼:運行時異常 - 無法啓動接收器

public class ConnectionReciever extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager connectivityManager = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); 
     if (activeNetwork != null && activeNetwork.isConnected()) { 
//   Toast.makeText(context, "Internet Connection is Active", 
//     Toast.LENGTH_LONG).show(); 
      AlertDialog successAlert=new AlertDialog.Builder(context).create(); 
      successAlert.setMessage("Internet Connection is Active"); 
      successAlert.show(); 

     } else { 
       AlertDialog failureAlert=new AlertDialog.Builder(context).create(); 
       failureAlert.setMessage("Internet Connection Timed Out....Please try again"); 
       failureAlert.show(); 
     } 

    } 
} 

它正確顯示吐司消息。現在,當我添加警報對話框時,我的應用程序崩潰。無法弄清原因。警報對話框中有任何錯誤嗎?

日誌條目貓:

06-11 06:02:02.010: W/dalvikvm(3823): threadid=1: thread exiting with uncaught exception (group=0xb2abbba8) 
06-11 06:02:02.040: E/AndroidRuntime(3823): FATAL EXCEPTION: main 
06-11 06:02:02.040: E/AndroidRuntime(3823): Process: com.example.finalassignment, PID: 3823 
06-11 06:02:02.040: E/AndroidRuntime(3823): java.lang.RuntimeException: Unable to start receiver com.example.finalassignment.ConnectionReciever: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2426) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at android.app.ActivityThread.access$1700(ActivityThread.java:135) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at android.os.Handler.dispatchMessage(Handler.java:102) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at android.os.Looper.loop(Looper.java:136) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at java.lang.reflect.Method.invoke(Method.java:515) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at dalvik.system.NativeStart.main(Native Method) 
06-11 06:02:02.040: E/AndroidRuntime(3823): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at android.view.ViewRootImpl.setView(ViewRootImpl.java:540) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at android.app.Dialog.show(Dialog.java:286) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at com.example.finalassignment.ConnectionReciever.onReceive(ConnectionReciever.java:25) 
06-11 06:02:02.040: E/AndroidRuntime(3823):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2419) 
+0

隨着應用環境下,你不能顯示dialog..you需要傳遞活動上下文顯示對話框.. –

+0

我曾經背景下,這是從活動 – user3698989

+0

我通過活動傳遞上下文是這樣的:Intent intent = new Intent(this,ConnectionReciever.class); \t \t sendBroadcast(intent); – user3698989

回答

0

問題是與活動場景。您需要傳遞活動的上下文以顯示對話框。

+0

內,我傳遞了這樣的活動上下文:Intent intent = new Intent(this,ConnectionReciever.class); sendBroadcast(意向); – user3698989

+0

問題是你試圖從BroadcastReceiver中顯示AlertDialog,這是不允許的。您無法從BroadcastReceiver中顯示AlertDialog。只有活動可以顯示對話框。 您應該做其他事情,讓BroadcastReceiver像啓動時一樣啓動並啓動一個顯示對話框的活動。 – user1458027

+0

我將檢查互聯網連接是否處於活動狀態或不在廣播接收器內......然後我如何在活動中顯示警報? – user3698989

0

Context作爲參數傳遞給onReceive() is-a ReceiverRestrictedContext

要顯示對話框,您需要一個Context即-al Activity

要顯示來自廣播接收器的通知,請使用Notification而不是對話框。

如果您在清單中註冊了收件人,請勿嘗試向其傳遞Activity引用。一旦onReceive()返回,系統可以自由地終止進程 - 您不能在那裏執行任何異步操作(例如Dialog)。

0

在我的情況下,如果添加彈出式窗口或對話框時父視圖尚未準備好顯示並且視圖尚未附加到窗口,可能會發生這種情況。

解決的辦法是在觸發彈出菜單/對話框或延遲幾百毫秒彈出窗口之前,檢查視圖是否附加到窗口。

希望它有幫助。

0
: Unable to add window -- token null is not for an application 

在操作系統無法決定與哪個活動相關的窗口調用時發生,在此情況下爲警報對話框。現在,您正在嘗試使用從廣播接收器傳遞的上下文,該上下文仍然不會指示警報對話框應該附加到哪個活動。相反,在警報對話框中使用MyActivity.this作爲上下文,一切都會正常工作。

修改代碼:

public class ConnectionReciever extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); 
    if (activeNetwork != null && activeNetwork.isConnected()) { 
//   Toast.makeText(context, "Internet Connection is Active", 
//     Toast.LENGTH_LONG).show(); 

     AlertDialog.Builder alertDialog = new AlertDialog.Builder(MyActivity.this); 
     // Replace MyActivity with your activity name in MyActivity.this 
     alertDialog.setMessage("Internet Connection is Active"); 
     alertDialog.show(); 

    } else { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(MyProfile.this); 
     // Replace MyActivity with your activity name in MyActivity.this 
     alertDialog.setMessage("Internet Connection Timed Out....Please try again"); 
     alertDialog.show(); 

    } 

} 
} 
+0

我沒有得到封閉的MainActivity類型的實例可以在範圍內訪問; – user3698989

+0

哦,這是很長的解釋。其實你需要在你的課堂上創建一個活動實例。你可以發送聊天室的電子郵件ID嗎? – Kailas

相關問題