之前研究了android的handler和线程,但是一直没有使用到,也一直不理解为何要用。直到遇到了这个问题。
Only the original thread that created a view hierarchy can touch its views
来由是视频播放控制栏使用了popwindow 然后需要在onprepare设置当前播放时间,也就是在主线程中访问数据,再设置另外一个view的画面就导致了这个问题,此时就用到了线程+handler。
private IMediaPlayer.OnPreparedListener preparedListener = new IMediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(IMediaPlayer iMediaPlayer) {
Log.d(TAG, "onPrepared");
iMediaPlayer.start();
int duration = (int) iMediaPlayer.getDuration();
Log.d(TAG, "mMediaPlayer.start();" + "duration" + duration);
mControlView.setEndtime(duration);
mControlView.setProgressMax(duration);
new Thread() {
public void run() {
isplaying = true;
while (isplaying) {
position = (int)iMediaPlayer.getCurrentPosition();
myHandler.sendEmptyMessage(PROGRESS_CHANGE);
//Log.d(TAG, "position = " + position);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Log.d(TAG, "run = " + position);
};
}.start();
}
};
final Handler myHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case PROGRESS_CHANGE:
mControlView.setCurrentTime(position);
mControlView.setProgress(position);
//Log.d(TAG, "PROGRESS_CHANGE" + position);
break;
}
}
};