2014-05-11 2 views
0

백그라운드에서 비동기 작업을 실행하여 네트워크를 통해 내 로컬 sqLite 데이터베이스를 지속적으로 업데이트합니다. 내 응용 프로그램을 일시 중지 한 후 임의의 시간을 제외하고 모든 것이 잘 작동합니다. 내가 오류를 얻을 경우 여기에 코드의 일부이다 :안드로이드 : 새로운 의도로 AsyncTask에서 NullPointerException이 발생합니다.

public class AsyncHardwareDBUpdate extends AsyncTask { 
ImageCellAdapter mImageCellAdapter; 
GridView dynGrid; 
Context mContext; 
Boolean mFinished = false; 

HardwareSyncReceiver myHardwareReceiver; 
private Handler handler; 
public AsyncHardwareDBUpdate(Context mContext) { 
     this.mContext = mContext; 
    } 

@Override 
protected Object doInBackground(Object... params) { 
    if (mContext != null){ 

오류는 다음 행으로 이동 :

 Intent intentHardwareSync = new Intent(mContext,SyncHardwareStateService.class); 

내가 이해 못할, 이미 mContext 여부를 확인하는 경우, 여기에 null이 될 수있는 ! = null. 코드의 나머지 :

 mContext.startService(intentHardwareSync); 
     myHardwareReceiver = new HardwareSyncReceiver(); 
     //register BroadcastReceiver 

     IntentFilter intentHardwareSyncFilter = new IntentFilter(SyncHardwareStateService.ACTION_SyncHardwareStateService); 

     intentHardwareSyncFilter.addCategory(Intent.CATEGORY_DEFAULT); 

     //Handler for the separate Thread 


     HandlerThread handlerThread = new HandlerThread("MyNewThread"); 
     handlerThread.start(); 

     Looper looper = handlerThread.getLooper(); 
     // Create a handler for the service 
     handler = new Handler(looper); 
     // Register the broadcast receiver to run on the separate Thread 
     mContext.registerReceiver (myHardwareReceiver, intentHardwareSyncFilter, null, handler); 
    } 
     return null; 
} 


05-11 18:07:37.830: E/AndroidRuntime(15063): FATAL EXCEPTION: AsyncTask #1 
05-11 18:07:37.830: E/AndroidRuntime(15063): java.lang.RuntimeException: An error occured while executing doInBackground() 
05-11 18:07:37.830: E/AndroidRuntime(15063): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at java.lang.Thread.run(Thread.java:856) 
05-11 18:07:37.830: E/AndroidRuntime(15063): Caused by: java.lang.NullPointerException 
05-11 18:07:37.830: E/AndroidRuntime(15063): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:127) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at android.content.ComponentName.<init>(ComponentName.java:75) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at android.content.Intent.<init>(Intent.java:3350) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at com.smarthomev5.AsyncUpdateThread.AsyncHardwareDBUpdate.doInBackground(AsyncHardwareDBUpdate.java:38) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
05-11 18:07:37.830: E/AndroidRuntime(15063): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
05-11 18:07:37.830: E/AndroidRuntime(15063): ... 5 more 
+1

onPostexecute에서 의도를 시작하십시오 – Chiradeep

+0

감사합니다 :) 아직 예기치 않은 오류가 발생했습니다 ... –

답변

1

메모리 누수처럼 나에게 소리. Context 또는 Activity 또는 기타 이와 같은 객체를 전달할 때는 항상 WeakReferencesAsyncTasks에 사용하십시오.

public class ExampleAsyncTask extends AsyncTask<Void, Void, Boolean> { 

    private final WeakReference<Context> contextReference; 

    public ExampleAsyncTask(Context context) { 
     this.contextReference = new WeakReference<Context>(context); 
    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 

     Context context = this.contextReference.get(); 
     if(context != null) { 
      // Do your work 
     } 
     return false; 
    } 

    @Override 
    protected void onPostExecute(Boolean aBoolean) { 
     super.onPostExecute(aBoolean); 

     Context context = this.contextReference.get(); 
     if(context != null) { 
      // Do your work 
     } 
    } 
} 

무엇 WeakReference가하는 것은 가비지 수집 할 참조하는 개체에 대해 허용하는 것입니다 : 이런 식으로 뭔가를 시도하십시오. 참조를 직접 보유하면 가비지 수집 할 수 없으므로 ThreadsAsyncTasks에 메모리 누수가 발생할 수 있습니다. 예를 들어 Context 참조를 직접 보유하고 Context 개체가 들어오는 Activity이있는 경우 (예 : 기기를 회전하거나 배경에 Activity이 잠시 동안 재현되는 경우)가 발생합니다. 당신이 위의 예에서

WeakReferenceContext 객체를 저장하고, 때마다 당신은이 Context 먼저는 WeakReference에서 얻을 필요가 사용하고 싶습니다. WeakReference에서 얻은 정보는 null인지 아닌지 간단히 확인할 수 있습니다. 0보다 작 으면 Context으로 작업하는 것이 안전합니다. 이 값이 Context보다 작거나 해당 Activity이 이미 가비지 수집되어 더 이상 사용할 수없는 경우

+0

빠른 답변을 주셔서 감사합니다.이 오류는 없애 버렸습니다. 어쨌든 내 앱을 더 안정하게 만듭니다. 나는 아직도 당신의 팁을 사용했습니다 :) –

관련 문제