2017-02-26 62 views
0

我读过以前的关于此问题的线索,但答案无法解决我的问题。 我有一个BroadcastReceiver这里面MainActivity一个内部类失败,出现以下异常:java.lang.RuntimeException:无法在MainActivity中使用BroadcastReceiver内部类实例化接收器

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

使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"/> 

请告知任何人。

+0

检查[this](http://stackoverflow.com/questions/4619049/unable-to-instantiate-receiver-in-broadcastreceiver-sms) –

+0

谢谢,但这不是我的情况。我的内部类已找到,但无法实例化。 –

回答

1

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

然后,这是您的应用程序中的错误,您需要修复该错误。

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

+0

好吧,但为什么它说“没有空的构造函数”,而我有一个空的构造函数? –

+0

@LiorL:因为它不是“静态”类或独立的公共类。唯一可以创建接收器实例的是您的活动。特别是,框架类不能创建接收器的实例。 – CommonsWare

+1

@LiorL从技术上讲,你的内部类有一个空构造函数。但是,因为它没有声明为'static',所以编译器实际上会在空的构造函数中生成一个单参数的构造函数。单一参数是周围外部类的实例。一个非静态的内部类隐式地有一个成员变量,它是对周围外部类的实例的引用。 –

相关问题