Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AlarmManager生命周期和取消错误_Android_Alarmmanager - Fatal编程技术网

Android AlarmManager生命周期和取消错误

Android AlarmManager生命周期和取消错误,android,alarmmanager,Android,Alarmmanager,我有一个应用程序,它已经有一个小部件,还有一个服务,每5秒钟更新一次小部件 这是我的AppWidgetProvider: public class MyWidget extends AppWidgetProvider { PendingIntent service = null; AlarmManager alarmManager; @Override public void onUpdate(Context context, AppWidgetManager

我有一个应用程序,它已经有一个
小部件
,还有一个
服务
,每5秒钟更新一次小部件

这是我的
AppWidgetProvider

public class MyWidget extends AppWidgetProvider {

    PendingIntent service = null;
    AlarmManager alarmManager;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        final Intent i = new Intent(context, MyService.class);

        if(service == null) {
            service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
        }

        alarmManager.setRepeating(AlarmManager.RTC, SystemClock.elapsedRealtime(), 1000*5, service);
    }

    @Override
    public void onDisabled(Context context) {
        Log.d("LogTag", "onDisabled");
        alarmManager.cancel(service);
        service.cancel();
    }
}
和我的
服务

public class MyService extends Service {

    int b = 5;

    @Override
    public void onCreate() { super.onCreate(); }

    public int onStartCommand(Intent intent, int flags, int startId) {
        this.buildUpdate();
        return 0;
    }   

    private void buildUpdate() {
        Log.d("AAA", "Update is coming");

        RemoteViews rmViews = new RemoteViews(getPackageName(), R.layout.widget_layout);

        rmViews.setTextViewText(R.id.hello, "Iterator: " + Integer.toString(b));

        ComponentName thisWidget = new ComponentName(this, MyWidget.class);

        AppWidgetManager manager = AppWidgetManager.getInstance(this);

        manager.updateAppWidget(thisWidget, rmViews);

        b++;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}
服务
和其他事情都很好。但我仍然有一些关于这些东西的问题:

  • SystemClock.elapsedRealtime()
    方法中的参数是什么?它指出什么时候开始吗

  • 当我尝试删除小部件时,出现了一些错误(在下面),不幸的是,
    AlarmManager
    仍然无法取消。我错过了什么

  • 在小部件初始化(或调用)之前,我需要执行一些网络操作。小部件应该有一些来自服务器的数据。我应该使用
    AsyncTask
    还是什么

  • 当我尝试删除小部件时,得到:

    03-04 23:39:51.428: E/AndroidRuntime(5646): Uncaught handler: thread main exiting due to uncaught exception
    03-04 23:39:51.438: E/AndroidRuntime(5646): java.lang.RuntimeException: Unable to start receiver com.example.widget.MyWidget: java.lang.NullPointerException
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2646)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at android.app.ActivityThread.access$3100(ActivityThread.java:119)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at android.os.Handler.dispatchMessage(Handler.java:99)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at android.os.Looper.loop(Looper.java:123)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at android.app.ActivityThread.main(ActivityThread.java:4363)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at java.lang.reflect.Method.invokeNative(Native Method)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at java.lang.reflect.Method.invoke(Method.java:521)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at dalvik.system.NativeStart.main(Native Method)
    03-04 23:39:51.438: E/AndroidRuntime(5646): Caused by: java.lang.NullPointerException
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at com.example.widget.MyWidget(MyWidget.java:33)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:76)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2637)
    03-04 23:39:51.438: E/AndroidRuntime(5646):     ... 10 more
    
  • SystemClock.elapsedRealTime()
    当前位于
    triggerAtTime
    参数中,这意味着您在那里输入的任何数字都是您希望闹钟响起的时间
    elapsedRealtime()
    自系统启动以来以毫秒计,包括深度睡眠。当测量可能跨越系统睡眠周期的时间间隔时,应使用该时钟

  • 在禁用的
    onDisabled
    方法中,需要重新创建整个
    pendingent
    。我猜它在那里是空的,因为当您调用
    onDisabled
    时它实际上并不存在,而只存在于
    onUpdate
    中。因此,以与之前完全相同的方式重新创建
    服务
    变量
    pendingent
    ,然后按原样调用cancel

  • AsyncTask
    s适用于类似的事情。
    AsyncTask
    在后台生成一个托管线程,并在UI线程继续运行时工作,然后可以在完成时更新UI线程。因此,如果你有很多繁重的网络工作要做,一个
    AsyncTask
    可以很好地处理这些工作。
    AsyncTask
    上的文档非常有用。找到他们。这取决于你在做什么,有很多选择,因此你必须在第三点上更详细地解释你的问题,以获得更为量身定制的答案


  • 非常感谢。还没有尝试异步任务,但得到了一些线索。