Hallo!
Ich habe eine Service Klasse (Android, da meine Frage mit Android aber nichts zu tun hat, poste ich sie hier), die Einen Musikplayer verwaltet. Das Problem ist, das der Service so knapp 30% CPU frisst, und den RAM immer weiter füllt (Und die Ladezeiten sind auch nicht grade kurz) Hat jemand eine Idee, wie ich das ganze verbessern kann?
Hier der Code:
Ich habe eine Service Klasse (Android, da meine Frage mit Android aber nichts zu tun hat, poste ich sie hier), die Einen Musikplayer verwaltet. Das Problem ist, das der Service so knapp 30% CPU frisst, und den RAM immer weiter füllt (Und die Ladezeiten sind auch nicht grade kurz) Hat jemand eine Idee, wie ich das ganze verbessern kann?
Hier der Code:
Java:
package com.ludevstudio.mp3audiobookplayer.services;
import android.app.Notification;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Switch;
import com.ludevstudio.mp3audiobookplayer.data.AudioFile;
import com.ludevstudio.mp3audiobookplayer.data.Book;
import com.ludevstudio.mp3audiobookplayer.data.Library;
import java.io.File;
import java.sql.Time;
import java.util.Timer;
import java.util.TimerTask;
public class MediaPlayerService extends Service {
public Notification notification;
NotificationCompat.Builder notificationBuilder;
RemoteViews.RemoteView sNotificationView;
MediaPlayer player;
Timer progressTimer;
Thread progressThread;
Thread workerThread;
Book book;
AudioFile[] chapters;
Library library;
@Override
public void onCreate() {
super.onCreate();
library =new Library();
}
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
workerThread =new Thread(new Runnable() {
@Override
public void run() {
// if service is starting fi4rst time
if(book==null || player==null || chapters==null) {
// get book
if(intent.getParcelableExtra("book")!=null) {
book = intent.getParcelableExtra("book");
}
// set chapters
loadBookChapters();
// init player
initPlayer();
}
String cmd = intent.getAction();
Log.d("logdata111", "switch statement");
switch(cmd) {
case Action.ACTION_PLAY :
play();
sendStats();
startSendingProgress();
break;
case Action.ACTION_PAUSE :
pause();
break;
case Action.ACTION_STARTSENDINGPROGRESS :
progressTimer.cancel();
progressThread.interrupt();
startSendingProgress();
break;
case Action.ACTION_STOPSENDINGPROGRESS :
progressTimer.cancel();
progressThread.interrupt();
break;
case Action.ACTION_CHANGEPLAYMODE :
if(player.isPlaying()) {
pause();
} else {
play();
}
sendStats();
break;
case Action.ACTION_SHUTDOWN :
onDestroy();
break;
}
sendStats();
}
});
workerThread.start();
return START_NOT_STICKY;
}
private void play() {
if(!player.isPlaying()) {
player.seekTo((int)book.getCurrentChapterprogress());
player.start();
startSendingProgress();
}
}
private void pause() {
player.pause();
stopSendingProgress();
updateBook(true);}
private void loadBookChapters() {
long start = System.currentTimeMillis();
File[] cFilesTmp = library.getChaptersOfBook(new File(book.getPath()));
chapters = new AudioFile[cFilesTmp.length];
chapters[book.getCurrentChapter()-1] =new AudioFile(cFilesTmp[book.getCurrentChapter()-1]);
chapters[book.getCurrentChapter()] =new AudioFile(cFilesTmp[book.getCurrentChapter()]);
new Thread(new Runnable() {
@Override
public void run() {
for(int i =0; i< cFilesTmp.length; i++) {
if(chapters[i]!=null)
chapters[i] =new AudioFile(cFilesTmp[i]);
}
}
}).start();
}
private void nextChapter() {
if (book.getCurrentChapter()<book.getChapters()) {
book.setCurrentChapterprogress(0);
book.setCurrentChapter(book.getCurrentChapter() + 1);
updateBook(false);
updatePlayer();
play();
} else {
book.setCurrentChapter(1);
book.setCurrentChapterprogress(0);
updateBook(false);
updatePlayer();
}
sendStats();
}
private void updatePlayer() {
player.release();
player = MediaPlayer.create(this, Uri.parse(chapters[book.getCurrentChapter()-1].getPath()));
}
private void updateBook(boolean shouldGetProgressFromPlayer) {
if(shouldGetProgressFromPlayer)
book.setCurrentChapterprogress(player.getCurrentPosition());
book.setCurrentProgress(library.calcCurrentBookProgress(book));
Intent intent =new Intent(this, DataBaseService.class);
intent.putExtra("book", book);
intent.setAction(DataBaseService.ACTION.ACTION_SAVE_BOOK);
startService(intent);
}
private void initPlayer() {
player = MediaPlayer.create(this, Uri.parse(chapters[book.getCurrentChapter()-1].getPath()));
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
nextChapter();
}
});
}
private void startSendingProgress() {
progressThread =new Thread(new Runnable() {
@Override
public void run() {
progressTimer =new Timer("progresstimer");
long delay = 1000;
TimerTask task =new TimerTask() {
@Override
public void run() {
Intent status =new Intent("progress");
status.putExtra(Status.STATUS_PROGRESS, player.getCurrentPosition());
LocalBroadcastManager.getInstance(MediaPlayerService.this).sendBroadcast(status);
}
};
progressTimer.schedule(task, 0, delay);
}
});
progressThread.start();
}
private void stopSendingProgress() {
progressTimer.cancel();
progressThread.interrupt();
}
private void sendStats() {
Bundle statusData =new Bundle();
statusData.putString(Status.STATUS_TITLE, book.getTitle());
statusData.putLong(Status.STATUS_ID, book.getID());
statusData.putInt(Status.STATUS_CHAPTERS, book.getChapters());
statusData.putInt(Status.STATUS_CURRENTCHAPTER, book.getCurrentChapter());
statusData.putLong(Status.STATUS_DURATION, book.getDuration());
statusData.putBoolean(Status.STATUS_ISPLAYING, player.isPlaying());
statusData.putInt(Status.STATUS_PROGRESS, player.getCurrentPosition());
Intent status = new Intent("stats");
status.putExtra("statusdata", statusData);
LocalBroadcastManager.getInstance(this).sendBroadcast(status);
updateBook(true);
}
@Override
public void onDestroy() {
player.stop();
new Thread(new Runnable() {
@Override
public void run() {
updateBook(true);
}
}).start();
progressThread.interrupt();
progressTimer.cancel();
workerThread.interrupt();
super.onDestroy();
}
@Override
public void onTaskRemoved(Intent rootIntent) {
super.onTaskRemoved(rootIntent);
onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public interface Action {
public static final String ACTION_PLAY = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.action.play";
public static final String ACTION_PAUSE = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.action.pause";
public static final String ACTION_STARTSENDINGPROGRESS = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.action.startsendingprogress";
public static final String ACTION_STOPSENDINGPROGRESS = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.action.stopstendingprogress";
public static final String ACTION_CHANGEPLAYMODE = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.action.changeplaymode";
public static final String ACTION_SHUTDOWN = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.action.shutdown";
}
public interface Status {
public static final String STATUS_TITLE = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.status.title";
public static final String STATUS_CURRENTCHAPTER = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.status.chapterprogress";
public static final String STATUS_CHAPTERS = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.status.chapters";
public static final String STATUS_DURATION = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.status.duration";
public static final String STATUS_ID = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.status.id";
public static final String STATUS_PROGRESS = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.status.progress";
public static final String STATUS_ISPLAYING = "com.ludevstudio.mp3audiobookplayer.services.mediaplayerservice.status.isplaying";
}
}