当我的用户迁移到ICS时,WakefulIntentService NEW CRASH报告?

时间:2012-09-21 05:47:08

标签: android intentservice commonsware-cwac

我的用户正在慢慢迁移到ICS(Android 4.0及更高版本),从那时起我就会看到新的崩溃报告出现......看起来我的WakefulIntentService实现会触发以下错误:

  

java.lang.NullPointerException at   com.cousinHub.meteo.AppService.doWakefulWork(AppService.java:104)at at   com.cousinHub.meteo.WakefulIntentService.onHandleIntent(WakefulIntentService.java:70)   在   android.app.IntentService $ ServiceHandler.handleMessage(IntentService.java:59)   在android.os.Handler.dispatchMessage(Handler.java:99)at   android.os.Looper.loop(Looper.java:123)at   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);
        }

=>由于某种原因,intent看起来是空的?

或者它可能是触发NullPointer异常的下一个代码块:

finally {
            getLock(this).release();
        }
  • 你怎么解决这个问题?
这种方式可能吗?

if ((this!=null)&&(intent!=null)) {
            try {
                doWakefulWork(intent);
            }
            finally {
                getLock(this).release();
            }
        }

1 个答案:

答案 0 :(得分:2)

您会注意到您的例外来自:

com.cousinHub.meteo.AppService.doWakefulWork(AppService.java:104)

首先,我没有在com.cousinHub.meteo包中写任何内容。其次,这将在doWakefulWork()方法的实现中,我发布的仅有的只是样本。第三,您拒绝发布doWakefulWork()的实施,并指出第104行。

我谦卑地建议你检查你的AppService课程,第104行,以确定你出错的地方。