Android Mediaplayer被AsyncTask停止-Mediaplayer未经发布即完成
我通过下载新文件启动我的应用程序,如果有任何文件,则启动播放循环。然后,我启动一个任务,每x秒查找一次新媒体。一旦调用该任务,视频将停止播放错误MediaPlayer,而不会被释放 它应该下载新的媒体,如果有,只是更新播放列表 从它的日志中,我可以看到第一个播放被调用,然后错误出现,然后。它只是一次又一次地调用任务。好像卡在里面了 我确信这是我在这里遗漏的一些愚蠢的问题。我不知道为什么mediaplayer会停止 main活动Android Mediaplayer被AsyncTask停止-Mediaplayer未经发布即完成,android,android-asynctask,android-mediaplayer,Android,Android Asynctask,Android Mediaplayer,我通过下载新文件启动我的应用程序,如果有任何文件,则启动播放循环。然后,我启动一个任务,每x秒查找一次新媒体。一旦调用该任务,视频将停止播放错误MediaPlayer,而不会被释放 它应该下载新的媒体,如果有,只是更新播放列表 从它的日志中,我可以看到第一个播放被调用,然后错误出现,然后。它只是一次又一次地调用任务。好像卡在里面了 我确信这是我在这里遗漏的一些愚蠢的问题。我不知道为什么mediaplayer会停止 main活动 public class MainActivity extends
public class MainActivity extends Activity implements OnCompletionListener {
int playListIndex;
int currentMedia;
String mediaName;
ArrayList<Integer> playList = new ArrayList<Integer>();
File[] filelist;
private VideoView videoView;
private ImageView imageView;
Uri mediaPath;
private Handler mHandler = new Handler();
private SurfaceHolder holder;
// Get this shit from login!
public String channelid = "5e6299eb-asd6600d58fc9";
public String username = "tvasd";
public String linkid = "70casd6600d3f7d7";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// File mediadir = getDir("tvr", Context.MODE_PRIVATE);
// filelist = mediadir.listFiles();
try {
downloadMedia(this);
updateMediaTask(this);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Delete all files in folder
// if (mediadir.isDirectory()) {
// String[] children = mediadir.list();
// for (int i = 0; i < children.length; i++) {
// new File(mediadir, children[i]).delete();
// }
// }
}
@Override
public void onCompletion(MediaPlayer mp) {
Log.i("media player", "play next please!");
if (mp != null) {
mp.release();
}
// play next video
currentMedia++;
if (currentMedia > playList.size() - 1) {
currentMedia = 0;
}
Log.d("MEDIA_COUNTER", String.format("%d", currentMedia));
try {
playMedia(currentMedia);
} catch (IOException e) {
e.printStackTrace();
}
}
private void playMedia(int playListIndex) throws IOException {
Log.i("media player", "play media!");
String path = filelist[playListIndex].getAbsolutePath();
FileInputStream fileInputStream = new FileInputStream(path);
final Uri uri = Uri.parse(path);
String filename = filelist[playListIndex].getName();
Log.i("FILENAME", path);
if (filename.contains("image")) {
imageView = (ImageView)findViewById(R.id.imageView);
imageView.setVisibility(View.VISIBLE);
imageView.setImageURI(uri);
mHandler.postDelayed(new Runnable() {
public void run() {
imageView.setVisibility(View.GONE);
imageView.setImageURI(uri);
onCompletion(null);
}
}, 4000);
} else if (filename.contains("video")) {
Log.d("PLAY",String.format("%s", fileInputStream.getFD()));
Log.i("media player", "play video!");
SurfaceView surface = (SurfaceView) findViewById(R.id.surface);
holder = surface.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i("SURFACE", "Created");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
});
MediaPlayer pl = new MediaPlayer();
pl.setOnCompletionListener(this);
pl.setDisplay(holder);
pl.setDataSource(fileInputStream.getFD());
pl.prepare();
pl.start();
}
}
void createPlayList(Context context) {
ContextWrapper cw = new ContextWrapper(context);
File mediadir = cw.getDir("tvr", Context.MODE_PRIVATE);
filelist = mediadir.listFiles();
if (filelist != null)
{
for ( int i = 0;i<filelist.length;i++)
{
Log.i("FOKKER", filelist[i].getName());
Log.i("FOKKER", filelist[i].getAbsolutePath());
}
}
currentMedia = 0;
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
try {
playMedia(currentMedia);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private void updateMediaTask(final MainActivity a) throws IOException, JSONException {
int delay = 1000; // delay for 1 sec.
int period = 3000; // repeat every 10 minutes. 60000
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
new updateFiles(a).execute(getBaseContext(),"update");
}
}, delay, period);
}
private void downloadMedia(Context context) throws IOException, JSONException {
new updateFiles(this).execute(context,"new");
}
}
这个问题很久以前就被问过了。但问题的解决方案不是异步任务,而是在类中创建MediaPlayer字段,而不是将其作为任何方法的局部变量 目前在您的案例中,它是私有void playMedia()方法的一部分。由于这是在一个方法中,所以一旦该方法完成,它就有资格进行垃圾收集。这样做:-
public class MainActivity extends Activity implements OnCompletionListener {
private MediaPlayer pl; // This makes sure mediaplayer is there if activity is alive
使用
mp.Release()时释放媒体播放器代码>。
它会解决你的问题
例如
mp.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
我想我看到了问题,可能是因为计时器部分,我认为应该在一个新线程中?如果我替换部分new updateFiles(a).execute(getBaseContext(),“update”);有了新的日志条目,它就可以工作了。因此,当它再次调用updateFiles时,它就停止了
,调用更新媒体任务(this)代码>应该足够了。另外,在1秒的初始延迟后,您每3秒安排一次计时器!!这就是你想要的吗?请检查您的int period=3000代码>行,替换为int period=10*60*1000代码>延迟10分钟。不,只是为了测试它的3000:-)!让我试试这个,永远不要使用=
运算符比较字符串。使用method.equals(“新”)改为在doInBackground()
方法中使用code>。
public class MainActivity extends Activity implements OnCompletionListener {
private MediaPlayer pl; // This makes sure mediaplayer is there if activity is alive
mp.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});