2017-02-26 60 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',所以編譯器實際上會在空的構造函數中生成一個單參數的構造函數。單一參數是周圍外部類的實例。一個非靜態的內部類隱式地有一個成員變量,它是對周圍外部類的實例的引用。 –

相關問題