2017-02-14 33 views
0

我的應用正試圖獲取USB設備列表。我的班級extendsService但是當我嘗試使用AsyncTask發生NullPointerException如何在android服務類的PendingIntent上使用上下文?

@Override 
protected String doInBackground(Void... params) { 
    Context context = MainActivity.getMainActivity(); 

    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); 

    HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); 
    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
    while (deviceIterator.hasNext()) { 
     UsbDevice device = deviceIterator.next(); 

     String ACTION_USB_PERMISSION = "my packagename.USB_PERMISSION"; 
     PendingIntent mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0); //NULLPOINTEXCEPTION; 
     manager.requestPermission(device, mPermissionIntent); 
     . 
     . 
     } 
    } 

logcat的

Process: blackeyeonandroid.iosystem.co.kr.toastama, PID: 15069 
    java.lang.RuntimeException: An error occurred while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:309) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
     at java.lang.Thread.run(Thread.java:818) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
     at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:526) 
     at android.app.PendingIntent.getBroadcast(PendingIntent.java:515) 
     at blackeyeonandroid.iosystem.co.kr.toastama.MyService$DeviceDetectAsync.doInBackground(MyService.java:124) 
     at blackeyeonandroid.iosystem.co.kr.toastama.MyService$DeviceDetectAsync.doInBackground(MyService.java:105) 
     at android.os.AsyncTask$2.call(AsyncTask.java:295) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
     at java.lang.Thread.run(Thread.java:818)  

我覺得上下文可能是問題,但我不知道如何獲得服務的環境。

+0

可能重複[什麼是NullPointerException,以及如何解決它?](http:// sta ckoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+1

服務本身就是一個上下文。你不需要活動。 –

回答

0

使用getApplicationContext();而不是您的MainActivity的上下文。

不要爲你的活動製造吸氣劑,因爲一旦它們被摧毀就無法到達。它總是會產生一個空指針。對於上下文,您可以從應用程序中獲取它,它貫穿於應用程序的整個生命週期中。 希望這有助於。

1

您可以在服務中使用getApplicationContext()來獲取應用程序上下文。

而在你的情況下,你嘗試保持主要活動上下文是UI部分,並且在後臺服務中不起作用。

0

如果你的類擴展Service意味着使用服務環境不使用Activity背景下,當從serivce通上下文初始化AsyncTask

啓動任務通過傳遞上下文

new DoSomething(this).execute(); 

AsyncTask類做這樣

class DoSomething extends AsyncTask<Void, String, String> { 
     private Context mContext; 

     public DoSomething(Context context) { 
      mContext = context; 
     } 

     @Override 
     protected String doInBackground(Void... voids) { 
      /*Use Context here*/ 

      return null; 
     } 
    } 
相關問題