Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android java.lang.RuntimeException:无法使用BroadcastReceiver内部类在MainActivity中实例化receiver_Android_Broadcastreceiver_Runtimeexception - Fatal编程技术网

Android java.lang.RuntimeException:无法使用BroadcastReceiver内部类在MainActivity中实例化receiver

Android java.lang.RuntimeException:无法使用BroadcastReceiver内部类在MainActivity中实例化receiver,android,broadcastreceiver,runtimeexception,Android,Broadcastreceiver,Runtimeexception,我以前读过关于这个问题的文章,但是答案不能解决我的问题。 我有一个BroadcastReceiver,它是MainActivity中的一个内部类,失败时出现以下异常: java.lang.RuntimeException:无法实例化receiver com.tac.kulik.dealsgrabber.MainActivity$DatabaseBroadcastReceiver:java.lang.InstanceException:无法实例化类com.tac.kulik.dealsgrabbe

我以前读过关于这个问题的文章,但是答案不能解决我的问题。 我有一个BroadcastReceiver,它是MainActivity中的一个内部类,失败时出现以下异常:

java.lang.RuntimeException:无法实例化receiver com.tac.kulik.dealsgrabber.MainActivity$DatabaseBroadcastReceiver:java.lang.InstanceException:无法实例化类com.tac.kulik.dealsgrabber.MainActivity$DatabaseBroadcastReceiver;没有空构造函数 位于android.app.ActivityThread.HandlerReceiver(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.Invokenactive(本机方法) 位于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.InstanceException:无法实例化类com.tac.kulik.dealsgrabber.MainActivity$DatabaseBroadcastReceiver;没有空构造函数 位于java.lang.Class.newInstanceImpl(本机方法) 位于java.lang.Class.newInstance(Class.java:1214) 位于android.app.ActivityThread.HandlerReceiver(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.Invokenactive(本机方法) 位于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内部类的主要活动:

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);
    }
};
public类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
.
.
.
.
.
试一试{
AlarmManager AlarmManager=(AlarmManager)getSystemService(Context.ALARM\u服务);
Intent dbIntent=新的Intent(MainActivity.this,DatabaseBroadcastReceiver.class);
PendingEvent PendingEvent=PendingEvent.getBroadcast(MainActivity.this,0,dbIntent,PendingEvent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(alarmManager.RTC_唤醒,calendar.getTimeInMillis(),alarmManager.INTERVAL_DAY,PendingEvent);
}捕获(例外e){
e、 printStackTrace();
}
}
公共类DatabaseBroadcastReceiver扩展了BroadcastReceiver{
公共数据库广播接收器(){
}
@凌驾
公共void onReceive(上下文、意图){
最终上下文mContext=上下文;
.
.
.
.
.
@凌驾
public void onLoadFinished(加载器arg0,光标){
Log.d(标记“onLoads=“+cursor.getCount());
mDealsAdapter.swapCursor(光标);
}
@凌驾
公共void onLoaderReset(加载程序arg0){
Log.d(标记“onLoaderReset”);
mDealsAdapter.swapCursor(null);
}
};
getSupportLoaderManager().initLoader(0,新捆绑包(),mCallback);
}
};
AndroidManifest.xml

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

请告诉任何人

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

那么这就是你应用程序中的一个bug,你需要修复这个bug


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

谢谢检查,但这不是我的情况。我的内部类已找到,但无法实例化。好吧,但为什么它会说“无空构造函数”,而我有空构造函数?@LiorL:因为它不是
静态类或独立的公共类。唯一可以创建接收方实例的是您的活动。特别是,框架类不能创建接收方的实例。@LiorL从技术上讲,您的内部类有一个空构造函数。但是,由于它没有声明为
静态
,编译器实际上会从空构造函数中生成一个单参数构造函数。单个参数是周围外部类的实例。非静态内部类隐式地具有一个成员变量,该变量是对周围外部类实例的引用。