如何添加计时器到服务?
问题描述:
我尝试添加一个计时器到OnCreate方法,Onstart,甚至是一个AsyncTask,但程序会崩溃。不太确定为什么!这是我的代码的一部分,在这种情况下,我添加到OnStart。如何添加计时器到服务?
@Override
public void onCreate() {
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d(TAG, "onCreate");
}
private void startTimer()
{
if (found != "Yes Found")
{
TimerTask updateProfile = new CustomTimerTask(MyService.this);
timer.scheduleAtFixedRate(updateProfile, 0, 60*1000);
}
}
@Override
public void onDestroy() {
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy");
//spool.release();
}
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
Log.d(TAG, "onStart");
startTimer();
}
定时器代码
public class CustomTimerTask extends TimerTask {
private Context context;
private Handler mHandler = new Handler();
// Write Custom Constructor to pass Context
public CustomTimerTask(Context con) {
this.context = con;
}
@Override
public void run() {
// TODO Auto-generated method stub
//some code here
}
}
错误消息
03-17 13:16:35.661: E/AndroidRuntime(7634): FATAL EXCEPTION: main
03-17 13:16:35.661: E/AndroidRuntime(7634): java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=xxxx }: java.lang.NullPointerException
03-17 13:16:35.661: E/AndroidRuntime(7634): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2387)
03-17 13:16:35.661: E/AndroidRuntime(7634): at android.app.ActivityThread.access$1900(ActivityThread.java:127)
03-17 13:16:35.661: E/AndroidRuntime(7634): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1221)
03-17 13:16:35.661: E/AndroidRuntime(7634): at android.os.Handler.dispatchMessage(Handler.java:99)
03-17 13:16:35.661: E/AndroidRuntime(7634): at android.os.Looper.loop(Looper.java:137)
03-17 13:16:35.661: E/AndroidRuntime(7634): at android.app.ActivityThread.main(ActivityThread.java:4511)
03-17 13:16:35.661: E/AndroidRuntime(7634): at java.lang.reflect.Method.invokeNative(Native Method)
03-17 13:16:35.661: E/AndroidRuntime(7634): at java.lang.reflect.Method.invoke(Method.java:511)
03-17 13:16:35.661: E/AndroidRuntime(7634): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:976)
03-17 13:16:35.661: E/AndroidRuntime(7634): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:743)
03-17 13:16:35.661: E/AndroidRuntime(7634): at dalvik.system.NativeStart.main(Native Method)
03-17 13:16:35.661: E/AndroidRuntime(7634): Caused by: java.lang.NullPointerException
03-17 13:16:35.661: E/AndroidRuntime(7634): at com.example.saber.MyService.startTimer(MyService.java:67)
03-17 13:16:35.661: E/AndroidRuntime(7634): at com.example.saber.MyService.onStart(MyService.java:86)
03-17 13:16:35.661: E/AndroidRuntime(7634): at android.app.Service.onStartCommand(Service.java:438)
03-17 13:16:35.661: E/AndroidRuntime(7634): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2370)
03-17 13:16:35.661: E/AndroidRuntime(7634): ... 10 more
确切位置在哪里我,我想补充的计时器?
答
你需要学习NullPointerException
是什么。这意味着您正在尝试调用某个对象的方法,该对象是null
。
您列出的堆栈跟踪显示您的NullPointerException
在MyService.java
的行号67上,在startTimer()
方法MyService
中。
当你算在你的代码行,我怀疑你会发现,行号的MyService.java
67是这一行:
timer.scheduleAtFixedRate(updateProfile, 0, 60*1000);
如果这确实是导致您的异常的行,这将意味着你得到一个NullPointerException
因为timer
是null
。由于您在初始化数据成员时未显示任何代码,因此这当然是可行的。
如果行号67不是我上面引用的行,那么您需要确定行67上的内容可能是null
- 请注意,它将是您在该行中调用方法的对象。
而且,正如其他人所指出的那样,你需要学习如何在Java对象比较。 !=
被比较对象身份,不反对平等。
字符串需要用'!字符串#等号进行比较()''不!='。另外,'定时器'在哪里实例化? – 2013-03-17 17:32:00
说明:请确保发现不为空,检查,如果使用(!“是找到” .equals(发现)) – 2013-03-17 17:32:39
我删除找到的字符串只是为了安全起见,但同样的错误。我更新了线程并添加了计时器代码。 – Ammar 2013-03-17 17:39:12