[英]Android Service unexpectedly stopping
對於我正在制作的android應用程序,我希望有一個服務可以檢查數據庫是否受到攻擊,即使該應用程序未運行(有點像facebook即使關閉也將通知某些內容),因此我制作了該類在下面,但我停止運行我的應用程序后一分鍾,我收到一條消息“應用程序已意外停止”,然后在幾分鍾后再次出現...我知道有可能不斷檢查導致許多應用程序執行此操作,但是我在做什么錯誤? 這是我到目前為止所擁有的:
package com.ducknoise.toonfight;
import java.sql.SQLException;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import android.widget.Toast;
public class ToonService extends Service{
public static ToonService toonService;
public ToonService(){
toonService = this;
}
@Override
public IBinder onBind(Intent intent) {
String toonName = intent.getStringExtra("toonName");
ToonDB task = new ToonDB();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,toonName);
} else {
task.execute(toonName);
}
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String toonName = intent.getStringExtra("toonName");
ToonDB task = new ToonDB();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,toonName);
} else {
task.execute(toonName);
}
return Service.START_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
Toast.makeText(getApplicationContext(), "Disconnected with Server", Toast.LENGTH_LONG).show();
Database db = new Database();
db.closeConnection();
super.onDestroy();
}
public class ToonDB extends AsyncTask<String,Void, Void>{
Toon toon;
@Override
protected Void doInBackground(String... params) {
Database db = new Database();
db.establishConnection();
toon = db.getToonFromDB(params[0]);
return null;
}
@Override
protected void onPostExecute(Void result) {
ToonCheck task = new ToonCheck();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,toon);
} else {
task.execute(toon);
}
super.onPostExecute(result);
}
}
public class ToonCheck extends AsyncTask<Toon,Void, Void>{
boolean runCheck;
Toon toon;
@Override
protected Void doInBackground(Toon... params) {
runCheck = true;
Database db = new Database();
db.establishConnection();
toon = params[0];
toon.updateCheckDB();
publishProgress();
if(!db.isOnline(toon))
runCheck = false;
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
Battle battle = toon.getBattle();
if(battle != null ){
if(battle.notified()){
NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(getApplicationContext());
nBuilder.setContentTitle("Toon Fight");
String contentText = battle.getOppName() + " has attacked you!";
nBuilder.setContentText(contentText);
nBuilder.setSmallIcon(R.drawable.ic_launcher);
int notiID = 1295;
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(notiID, nBuilder.build());
}
}
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void result) {
if(runCheck){
ToonCheck task = new ToonCheck();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,toon);
} else {
task.execute(toon);
}
}else
stopSelf();
super.onPostExecute(result);
}
}
}
這是logcat
03-24 11:01:41.968: D/AndroidRuntime(4624): Shutting down VM
03-24 11:01:41.968: W/dalvikvm(4624): threadid=1: thread exiting with uncaught exception (group=0x41f5aac8)
03-24 11:01:41.968: E/AndroidRuntime(4624): FATAL EXCEPTION: main
03-24 11:01:41.968: E/AndroidRuntime(4624): java.lang.RuntimeException: Unable to start service com.ducknoise.toonfight.ToonService@430a3950 with null: java.lang.NullPointerException
03-24 11:01:41.968: E/AndroidRuntime(4624): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2782)
03-24 11:01:41.968: E/AndroidRuntime(4624): at android.app.ActivityThread.access$2000(ActivityThread.java:152)
03-24 11:01:41.968: E/AndroidRuntime(4624): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1385)
03-24 11:01:41.968: E/AndroidRuntime(4624): at android.os.Handler.dispatchMessage(Handler.java:99)
03-24 11:01:41.968: E/AndroidRuntime(4624): at android.os.Looper.loop(Looper.java:137)
03-24 11:01:41.968: E/AndroidRuntime(4624): at android.app.ActivityThread.main(ActivityThread.java:5329)
03-24 11:01:41.968: E/AndroidRuntime(4624): at java.lang.reflect.Method.invokeNative(Native Method)
03-24 11:01:41.968: E/AndroidRuntime(4624): at java.lang.reflect.Method.invoke(Method.java:511)
03-24 11:01:41.968: E/AndroidRuntime(4624): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
03-24 11:01:41.968: E/AndroidRuntime(4624): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
03-24 11:01:41.968: E/AndroidRuntime(4624): at dalvik.system.NativeStart.main(Native Method)
03-24 11:01:41.968: E/AndroidRuntime(4624): Caused by: java.lang.NullPointerException
03-24 11:01:41.968: E/AndroidRuntime(4624): at com.ducknoise.toonfight.ToonService.onStartCommand(ToonService.java:34)
03-24 11:01:41.968: E/AndroidRuntime(4624): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2765)
03-24 11:01:41.968: E/AndroidRuntime(4624): ... 10 more
這就是我致電服務的方式:
Intent toonService = new Intent(MainActivity.this, ToonService.class);
toonService.putExtra("toonName", toon.getName());
MainActivity.this.startService(toonService);
您應該根據logcat
檢查onStartCommand
的intent
onStartCommand
為null
:
03-24 11:01:41.968: E/AndroidRuntime(4624): Caused by: java.lang.NullPointerException
03-24 11:01:41.968: E/AndroidRuntime(4624): at
com.ducknoise.toonfight.ToonService.onStartCommand(ToonService.java:34)
並請說明如何開始Service
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.