私のユーザーはゆっくりと ICS (Android 4.0 以降) に移行されており、それ以降、新しいクラッシュ レポートが表示されるのを確認できます...次のエラーをトリガーする WakefulIntentService の実装のようです:
com.cousinHub.meteo.AppService.doWakefulWork(AppService.java:104) での java.lang.NullPointerException com.cousinHub.meteo.WakefulIntentService.onHandleIntent(WakefulIntentService.java:70) での java.lang.NullPointerException IntentService.java:59) で android.os.Handler.dispatchMessage(Handler.java:99) で android.os.Looper.loop(Looper.java:123) で android.os.HandlerThread.run(HandlerThread.java:60) )
行 70 は、 onHandleIntent 内の問題を示しています。
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
abstract public class WakefulIntentService extends IntentService {
abstract protected void doWakefulWork(Intent intent);
public static final String LOCK_NAME_STATIC="com.commonsware.cwac.wakeful.WakefulIntentService";
private static PowerManager.WakeLock lockStatic=null;
public static void acquireStaticLock(Context context) {
getLock(context).acquire();
}
synchronized private static PowerManager.WakeLock getLock(Context context) {
if (lockStatic==null) {
PowerManager mgr=(PowerManager)context.getSystemService(Context.POWER_SERVICE);
lockStatic=mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOCK_NAME_STATIC);
lockStatic.setReferenceCounted(true);
}
return(lockStatic);
}
public static void sendWakefulWork(Context ctxt, Intent i) {
acquireStaticLock(ctxt);
ctxt.startService(i);
}
@SuppressWarnings("unchecked")
public static void sendWakefulWork(Context ctxt, Class clsService) {
sendWakefulWork(ctxt, new Intent(ctxt, clsService));
}
public WakefulIntentService(String name) {
super(name);
}
@Override
public void onStart(Intent intent, int startId) {
if (!getLock(this).isHeld()) { // fail-safe for crash restart
getLock(this).acquire();
}
super.onStart(intent, startId);
}
@Override
final protected void onHandleIntent(Intent intent) {
try {
doWakefulWork(intent);
}
finally {
getLock(this).release();
}
}
}
このコードが Gingerbread (Android < 4.0) で正常に動作し、現在は壊れている理由は??
try {
doWakefulWork(intent);
}
=> 何らかの理由でインテントが null のように見える ??
または、NullPointer Exception をトリガーする次のコード ブロックである可能性があります。
finally {
getLock(this).release();
}
- これをどのように解決しますか?
この道かな?
if ((this!=null)&&(intent!=null)) {
try {
doWakefulWork(intent);
}
finally {
getLock(this).release();
}
}