【问题标题】:java.lang.RuntimeException: Unable to instantiate receiver in MainActivity with BroadcastReceiver inner classjava.lang.RuntimeException:无法使用 BroadcastReceiver 内部类在 MainActivity 中实例化接收器
【发布时间】:2017-02-26 15:06:50
【问题描述】:

我已阅读有关此问题的先前帖子,但答案无法解决我的问题。 我有一个 BroadcastReceiver,它是 MainActivity 中的一个内部类,它失败并出现以下异常:

java.lang.RuntimeException: 无法实例化接收器 com.tac.kulik.dealsgrabber.MainActivity$DatabaseBroadcastReceiver: java.lang.InstantiationException: 无法实例化类 com.tac.kulik.dealsgrabber.MainActivity$DatabaseBroadcastReceiver;没有空的构造函数 在 android.app.ActivityThread.handleReceiver(ActivityThread.java:2410) 在 android.app.ActivityThread.access$1700(ActivityThread.java:142) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1279) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5118) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610) 在 dalvik.system.NativeStart.main(本机方法) 引起:java.lang.InstantiationException:无法实例化类com.tac.kulik.dealsgrabber.MainActivity$DatabaseBroadcastReceiver;没有空的构造函数 在 java.lang.Class.newInstanceImpl(本机方法) 在 java.lang.Class.newInstance(Class.java:1214) 在 android.app.ActivityThread.handleReceiver(ActivityThread.java:2405) 在 android.app.ActivityThread.access$1700(ActivityThread.java:142) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1279) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5118) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610) 在 dalvik.system.NativeStart.main(本机方法)

将 BroadcastReceiver 设为静态不是一种选择,因为我无法访问我需要使用的必要成员变量。

这是带有 BroadcastReceiver 内部类的 MainActivity:

public class MainActivity extends AppCompatActivity {

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

    try {
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent dbIntent = new Intent(MainActivity.this, DatabaseBroadcastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, dbIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmManager.INTERVAL_DAY, pendingIntent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public class DatabaseBroadcastReceiver extends BroadcastReceiver {

    public DatabaseBroadcastReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        final Context mContext = context;

        .
        .
        .
        .
        .

            @Override
            public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
                Log.d(TAG, "onLoadFinished s=" + cursor.getCount());

                mDealsAdapter.swapCursor(cursor);
            }

            @Override
            public void onLoaderReset(Loader<Cursor> arg0) {
                Log.d(TAG, "onLoaderReset");
                mDealsAdapter.swapCursor(null);
            }
        };
        getSupportLoaderManager().initLoader(0, new Bundle(), mCallback);
    }
};

AndroidManifest.xml

<receiver android:name=".MainActivity$DatabaseBroadcastReceiver"/>

请告知任何人。

【问题讨论】:

  • 检查this
  • 谢谢,但这不是我的情况。找到了我的内部类,但无法实例化。

标签: android broadcastreceiver runtimeexception


【解决方案1】:

将 BroadcastReceiver 设为静态不是一种选择,因为我无法访问我需要使用的必要成员变量。

那么这是您的应用程序中的一个错误,您需要修复该错误。

您的整个流程,更不用说活动,很可能在警报响起时将不存在。您的BroadcastReceiver 需要能够完全独立于活动而工作。通常,此类接收器被实现为顶级 public Java 类,以帮助实施此类独立性。

【讨论】:

  • 好的,但是为什么它说“没有空的构造函数”,而我确实有一个空的构造函数?
  • @LiorL:因为它不是static 类或独立的公共类。唯一可以创建接收器实例的是您的活动。特别是,框架类不能创建接收器的实例。
  • @LiorL 从技术上讲,您的内部类有一个空的构造函数。然而,因为它没有被声明为static,编译器实际上从你的空构造函数中生成了一个单参数构造函数。单个参数是周围外部类的实例。非静态内部类隐含一个成员变量,它是对周围外部类实例的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2014-05-07
相关资源
最近更新 更多