刚入android没多久,遇到的比较郁闷的问题就是子线程主线程的问题,更改UI界面,本想做一个图片的轮播但是比较简单,然后就试试实现视频跟图片切换播放进行不停的循环播放。也用过不少控件,但是知其然不知其所以然,后来自己写了一段来实现图片视频互相切换轮播。在这写下一篇博客也当自己学习的过程.希望大家多多指教希望
下面代码:
xml
xml version="1.0"encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/RelativeLayout1"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"tools:context="com.lishu.handler.MainActivity">android:id="@+id/imgchange"android:layout_width="500px"android:layout_height="500px"/>android:id="@+id/videoView"android:layout_width="match_parent"android:layout_height="wrap_content"android:visibility="gone"/>
在android5.1版本中会出现一定的错误。
07-27 03:08:58.413 3450-3475/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xe0 in tid 3475 (Binder_2)
07-27 03:08:59.537 3528-3546/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xe0 in tid 3546 (Binder_2)
[ 07-27 03:08:59.540 1166: 1166 E/ ]
invalid crash request of size 0 (from pid=3528 uid=0)
而在android高级一点的版本就没有这个问题 。也不知道是什么情况。。。 此贴算是抛砖引玉贴。
MainActivity.java
packagecom.lishu.handler;importandroid.app.Activity;importandroid.media.MediaPlayer;importandroid.net.Uri;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.util.Log;importandroid.view.View;importandroid.widget.ImageView;importandroid.widget.VideoView;importjava.util.Timer;importjava.util.TimerTask;import staticandroid.content.ContentValues.TAG;public classMainActivity extendsActivity {
privateImageView imgchange;privateTimer timer= newTimer();privateTimerTask task;privateVideoView videoView;private intflag= 0;//定义切换的图片的数组idintimgids[] = new int[]{R.drawable.one,R.drawable.two,R.drawable.three,R.drawable.four,R.drawable.five,};intimgstart= 0;privateHandler myHandler= newHandler() {
@Override//重写handleMessage方法,根据msg中what的值判断是否执行后续操作public voidhandleMessage(Message msg) {
if(msg.what== 0) {
Log.d("数据",String.valueOf(imgstart));imgchange.setImageResource(imgids[imgstart++]);}else if(msg.what== 1){
flag= 2;//首先要将这个标签换掉 不然会出现因为定时器的原因导致视频播放不全的问题。Log.d("测试",String.valueOf(flag));imgchange.setVisibility(View.GONE);videoView.setVisibility(View.VISIBLE);initData();//播放视频的方法}else{
Log.d("测试","啥我也不干 空定时器");}
}
};@Overrideprotected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imgchange= (ImageView) findViewById(R.id.imgchange);videoView= findViewById(R.id.videoView);start();}
/**选择播放图片还是播放视频*/public voidstart() {
task= newTimerTask() {
@Overridepublic voidrun() {
if(imgstart< imgids.length) {
Log.d(TAG,"length"+imgids.length);Message msg = Message.obtain();msg.what= 0;myHandler.sendEmptyMessage(flag);Log.d(TAG,"flag"+flag);} else{
if(flag== 2){
myHandler.sendEmptyMessage(flag);//啥也不干}else{
flag= 1;Log.d("测试",String.valueOf(flag));myHandler.sendEmptyMessage(flag);//播放视频}
}
}
};//定时器开始执行timer.schedule(task,0,5000);}
//播放视频private voidinitData() {
String uri = "android.resource://"+ getPackageName() + "/"+ R.raw.b;videoView.setVideoURI(Uri.parse(uri));//开始播放videoView.start();//播放完成回调videoView.setOnCompletionListener(newMyPlayerOnCompletionListener());//防止出现视频播放错误的问题videoView.setOnErrorListener(videoErrorListener);}
//防出现无法播放此视频窗口publicMediaPlayer.OnErrorListener videoErrorListener= newMediaPlayer.OnErrorListener() {
@Overridepublic booleanonError(MediaPlayer mp, intwhat, intextra) {
return true;}
};//回调方法private classMyPlayerOnCompletionListener implementsMediaPlayer.OnCompletionListener {
@Overridepublic voidonCompletion(MediaPlayer mp) {
/**再次启动图片的轮播,设置了imgstart为初始值*/
/**多个视频可以在这进行切换,进行一次判断加入还有视频就播放,没有就走下面这一段*/imgstart= 0;flag= 0;imgchange.setVisibility(View.VISIBLE);videoView.setVisibility(View.GONE);}
}
}