【问题标题】:Error receiving broadcast intent from broadcast receiver从广播接收器接收广播意图时出错
【发布时间】:2016-02-16 10:42:07
【问题描述】:

我有一个广播接收器,在 onRecive 中我执行 Asynctask,当执行时,在 preExecute 中,我显示一个对话框作为忙碌指示器。在运行时 AsyncTask 执行我收到以下 logcat 错误,为了修复该错误,我尝试将 getApplicationContext() 作为对上下文的引用传递给 asyncTask 的构造函数,但我仍然收到相同的错误

请告诉我如何修复该错误

代码

//executingt the AsyncTask from onReceive
if (sppBondState == BluetoothDevice.BOND_BONDED) {
    Log.d(TAG, SubTag.bullet("mBCR_STATE_CHANGED", "unbonding spp wil start"));
    ATSPPUnbond mATSPPUnbond = new ATSPPUnbond(getApplicationContext());
    mATSPPUnbond.execute();
}
...
...
...
 @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.w(TAG, SubTag.msg("ATSPPUnbond.onPreExecute"));
        ...
        ...
        ...
        this.mDialog = new Dialog(this.mCtx);
        this.mDialog.setCancelable(false);
        this.mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.mDialog.setContentView(R.layout.dialog_phases);

        this.mtvPhaseName = (TextView) this.mDialog.findViewById(R.id.act_main_tv_phase_name);
        this.mpbBusyIndicator = (ProgressBar) this.mDialog.findViewById(R.id.act_main_pb_busy_indicator);

        this.mtvPhaseName.setText(getApplicationContext().getResources().getString(R.string.phase_unbonding_from_remote_device));

        this.mDialog.show(); //line 776
    }

Logcat

FATAL EXCEPTION: main
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime: Process: com.example.com.vpager_00, PID: 28161
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime: java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetooth.adapter.action.STATE_CHANGED flg=0x4000010 (has extras) } in com.example.com.ecoassistant_03.ActMain$1@c73928a
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:933)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:145)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5938)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:  Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.view.ViewRootImpl.setView(ViewRootImpl.java:691)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:288)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.app.Dialog.show(Dialog.java:312)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at com.example.com.ecoassistant_03.ActMain$ATSPPUnbond.onPreExecute(ActMain.java:776)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.os.AsyncTask.execute(AsyncTask.java:535)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at com.example.com.ecoassistant_03.ActMain$1.onReceive(ActMain.java:123)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:923)
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739) 
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95) 
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:145) 
02-16 11:23:08.305 28161-28161/com.example.com.vpager_00 E/AndroidRuntime:     at android.app

【问题讨论】:

  • @user2121:在 Android 中显示 UI 元素的唯一方法是通过 Activity。不显示来自 Receiver 的进度。
  • @sasikumar 这可能是同一个错误..但是您发布的链接解决了其他问题,我已经检查过了
  • @kevz 请您进一步澄清一下..因为有时我能够使用 .executeonExecutor 从另一个 asyncTask 显示 asynctask 上的 UI 元素

标签: android android-asynctask broadcastreceiver android-broadcast android-broadcastreceiver


【解决方案1】:
  • 你不能从Receiver显示AlertDialog,因为它需要Activity的Context。

  • 相反,您可以使用Theme.Dialog 启动Activity,然后启动AsyncTask,这将显示AlertDialog

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2010-12-03
  • 2017-01-01
  • 1970-01-01
相关资源
最近更新 更多