2011-12-02 55 views
0

我制作了一个媒体播放器,通过shoutcast进行流媒体播放,并试图从歌曲流中获取歌曲标题。我已经成功获得了歌曲标题,并在一个文本视图中进行了显示,并在歌曲更改时对其进行更新。TextView小部件在android2.2上不更新

我用android模拟器测试了这段代码,使用了android 1.5和android 2.1。该代码的作品,但当我在android 2.2上测试它的文本没有更新。

任何想法,为什么它不更新?我用来更新textview的代码如下。

当我点击我的布局pageArtist()和PAGETITLE(按钮)将被调用,他们将获得歌曲名称和艺术家,改变TextView的文本每4秒

我的代码在我的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(); 
    } 

这是我的FOR更新我的TextView METHOD

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); 
    } 

EDIT:THIS CO DE每4秒重复一次TIMER

+1

在UI组件的变化应该在UI线程进行,而不是在后台线程。使用Handler或AsyncTask来更新UI。 –

+0

这是关于一个简单的'TextView'在一个活动(这是一个UI小部件)或关于一个真正的[Android应用小部件](http://developer.android.com/guide/topics/appwidgets/index.html) ? –

+0

感谢@adil soomro你能编辑我的代码吗?更正它谢谢 – HeartlessArchangel

回答

1

Adil的评论是正确的。您无法从后台线程更新UI,只能更新UI线程。要通过UI线程为此,删除代码在你的run方法的机构,设置文本,而是使用一个处理程序:

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); 
    } 
+0

好吧,我会尝试你的建议:) – HeartlessArchangel

+0

我似乎无法使它的工作,你可以编辑上面的代码,顺便说一句我希望这种方法重复每4秒 – HeartlessArchangel

+0

我用完整的代码编辑了我的回复。 – Chris