Android后台服务中的主题

时间:2014-04-28 10:06:58

标签: java android multithreading service android-asynctask

您好我是第一次尝试使用服务类并且一直面临问题。我想要的是一个无限运行(除非被Android系统杀死)具有活动网络连接的服务。我编写的代码在Android 4.3和4.4上工作正常但是当我尝试在Android 2.2上运行时应用程序崩溃了。我的代码如下:

public class BackgroundMusicService extends Service {

private MediaPlayer mp;
private int id;

private static class BackgroundAsyncTaskClass extends AsyncTask<Void, Void, Void>{
    protected Void doInBackground(Void... params) {
        Log.v("Async","Async Called");

                    /*Network connection will be created here*/

        return null;
    }
}

private class ForThread implements Runnable{
    public void run() {
        while (true) {
            try {
                Log.v("ThreadSleeping","5 sec");
                BackgroundAsyncTaskClass task = new BackgroundAsyncTaskClass();
                task.execute();
                Thread.sleep(5000);
            } catch (InterruptedException e) {
            }finally{
                Log.v("Finally called","Finally called");
            }   
        }
    }
}

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

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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.v("onStartCommand Called","onStart Command Called");

    Thread t;
    ForThread ft = new ForThread();
    t = new Thread(ft);
    t.start();

    return START_NOT_STICKY;
}


@Override
public void onDestroy() {
    super.onDestroy();
    if(null != mp){
        mp.stop();
        mp.release();
        Log.v("Destroyed","onDestroy Called");
    }
}

public void onTaskRemoved(Intent rootIntent) {

    Intent restartServiceIntent = new Intent(getApplicationContext(),
            this.getClass());
    restartServiceIntent.setPackage(getPackageName());

    PendingIntent restartServicePendingIntent = PendingIntent.getService(
            getApplicationContext(), 1, restartServiceIntent,
            PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager) getApplicationContext()
            .getSystemService(Context.ALARM_SERVICE);
    alarmService.set(AlarmManager.ELAPSED_REALTIME,
            SystemClock.elapsedRealtime() + 1000,
            restartServicePendingIntent);

    super.onTaskRemoved(rootIntent);
}

}

并且Android 2.2抛出的异常如下:

04-28 09:51:41.435: W/dalvikvm(280): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
04-28 09:51:41.435: E/AndroidRuntime(280): FATAL EXCEPTION: Thread-8
04-28 09:51:41.435: E/AndroidRuntime(280): java.lang.ExceptionInInitializerError
04-28 09:51:41.435: E/AndroidRuntime(280):  at com.example.backgroundservicedemo.BackgroundMusicService$ForThread.run(BackgroundMusicService.java:45)
04-28 09:51:41.435: E/AndroidRuntime(280):  at java.lang.Thread.run(Thread.java:1096)
04-28 09:51:41.435: E/AndroidRuntime(280): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-28 09:51:41.435: E/AndroidRuntime(280):  at android.os.Handler.<init>(Handler.java:121)
04-28 09:51:41.435: E/AndroidRuntime(280):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
04-28 09:51:41.435: E/AndroidRuntime(280):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
04-28 09:51:41.435: E/AndroidRuntime(280):  at android.os.AsyncTask.<clinit>(AsyncTask.java:152)

此外,当我尝试使用handler.post(new Runnable(){.... run(){} ....} UI挂断但后台线程继续运行并在内存不足后退出。

我怀疑的另一件事是: 当应用程序重新启动时,我希望此活动服务停止,但如何获取对在Background中运行的此线程的引用以及如何停止此操作?如果有人可以将我重定向到合适的链接/参考或者可以帮助我解决代码,我将不胜感激。感谢

1 个答案:

答案 0 :(得分:2)

你在线程的运行方法

中有这个
 BackgroundAsyncTaskClass task = new BackgroundAsyncTaskClass();
 task.execute();

来自文档的线程规则

  1. 必须在UI线程上加载AsyncTask类。这是从JELLY_BEAN开始自动完成的。

  2. 必须在UI线程上创建任务实例。 必须在UI线程上调用execute(Params ...)。

  3. 不要手动调用onPreExecute(),onPostExecute(Result),doInBackground(Params ...),onProgressUpdate(Progress ...)。

  4. 该任务只能执行一次(如果尝试第二次执行,则会抛出异常。)