我制作了一个通过广播播放的媒体播放器,并且试图从该流中获取歌曲标题。 我已经成功获取了歌曲标题,并将其显示在文本视图中,并在歌曲更改时对其进行了更新。
我已经使用android 1.5和android 2.1在android模拟器上测试了此代码。 该代码有效,但是当我在android 2.2上对其进行测试时,文本未更新。
有什么想法为什么不更新? 我用来更新textview的代码如下。
当我单击布局中的按钮时,将调用pageArtist()和pageTitle(),它们将获取歌曲标题和艺术家,并每4秒更改一次textview的文本
我的代码在我的ONCREATE()中
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
streamButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
pageArtist();
pageTitle();
}
这是我更新TEXTVIEW的方法
private void pageTitle(){
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
URL url;
try {
url = new URL("http://teststream.com:8000/listen.mp3");
IcyStreamMeta icy = new IcyStreamMeta(url);
TextView title1 = (TextView) findViewById(R.id.song_title);
String T;
T = icy.getTitle();
title1.setText(T);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, 2, 4000);
}
编辑 :此代码错误每4秒重复一次
Adil的评论是正确的。 您不能从后台线程更新UI,只能从UI线程更新。 要通过ui线程执行此操作,请删除设置文本的run方法主体中的代码,而应使用Handler:
private Handler handler;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
handler = new Handler();
streamButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
pageArtist();
pageTitle();
}
}
}
private void pageTitle(){
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
URL url;
try {
url = new URL("http://teststream.com:8000/listen.mp3");
IcyStreamMeta icy = new IcyStreamMeta(url);
final TextView title1 = (TextView) findViewById(R.id.song_title);
final String T = icy.getTitle();
handler.post(new Runnable(){
public void run(){
title1.setText(T);
}
});
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, 2, 4000);
}