2013-05-15 18 views
0

我想提出兩個的Runnable我的Android應用程序的工作:執行兩個的Runnable的Android

1)可運行R1爲改變ImageView的:

 Runnable r1 = new Runnable() { 

     @Override 
     public void run() { 
      albumpic.setImageResource(pub[i]); 
      i++; 
      if(i >= pub.length) { 
       i = 0; 
      } 
      albumpic.postDelayed(this, 3000); 
     } 
    }; 
    albumpic.postDelayed(r1, 3000); 

2)可運行R2改變一個TextView:

 Runnable r2 = new Runnable(){ 
      @Override 
      public void run(){ 
       out = "Title: " + retriever.extractMetadata(ShoutCastMetadataRetriever.METADATA_KEY_TITLE) + " \nArtist: " + retriever.extractMetadata(ShoutCastMetadataRetriever.METADATA_KEY_ARTIST); 
       title.setText(out); 
       title.postDelayed(this, 3000); 
      } 
     }; 
    title.postDelayed(r2, 3000); 

當我只運行其中一個工作正常,但是當我嘗試運行他們兩個他們不工作。

我該如何讓他們同時工作?

謝謝!

更新:我試圖用這樣的ThreadPoolExecutor的:

Runnable r1 = new Runnable() { 

     @Override 
     public void run() { 
      albumpic.setImageResource(pub[i]); 
      i++; 
      if(i >= pub.length) { 
       i = 0; 
      } 
      albumpic.postDelayed(this, 3000); 
     } 
    }; 


    Runnable r2 = new Runnable() { 

     @Override 
     public void run() { 
      out = "Title: " + retriever.extractMetadata(ShoutCastMetadataRetriever.METADATA_KEY_TITLE) + " \nArtist: " + retriever.extractMetadata(ShoutCastMetadataRetriever.METADATA_KEY_ARTIST); 
      title.setText(out); 
      title.postDelayed(this, 3000); 
     } 
    }; 

    ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); 
    executor.execute(r1); 
    executor.execute(r2); 

它給了我這些錯誤:

05-15 11:56:35.695: E/AndroidRuntime(11437): FATAL EXCEPTION: pool-2-thread-2 
05-15 11:56:35.695: E/AndroidRuntime(11437): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.view.ViewRoot.checkThread(ViewRoot.java:3090) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.view.ViewRoot.requestLayout(ViewRoot.java:666) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.view.View.requestLayout(View.java:8391) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.view.View.requestLayout(View.java:8391) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.view.View.requestLayout(View.java:8391) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.view.View.requestLayout(View.java:8391) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.view.View.requestLayout(View.java:8391) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.widget.TextView.checkForRelayout(TextView.java:5880) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.widget.TextView.setText(TextView.java:2888) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.widget.TextView.setText(TextView.java:2749) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at android.widget.TextView.setText(TextView.java:2718) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at com.adventure.agadir.MainActivity$11.run(MainActivity.java:241) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
05-15 11:56:35.695: E/AndroidRuntime(11437): at java.lang.Thread.run(Thread.java:1019) 
+0

什麼是「不工作」。意思是 – Blackbelt

+0

他們都應該完成預期的任務 Runnable「r1」應該每3秒更換一次圖片,而Runnable「r2」應該每3秒更換一次標題(TextView)。 當我運行它們時,ImageView Runnable是唯一可用的。 – user1885868

+0

任何崩潰錯誤? – Raghunandan

回答

2

你最好使用線程池:

ThreadPoolExecutor executor=(ThreadPoolExecutor) Executors.newFixedThreadPool(int n); 
//n-is a fixed number of maximum threads to do parallel; 
executor.execute(runnable1); 
executor.execute(runnable2); 

哦,我明白了。問題在於你試圖從後臺線程中改變textview中的文本,而不是從主要文件中改變文本。對於這樣做,你一定要使用Handler-它有點像從主線程的橋樑和後臺線程 http://developer.android.com/reference/android/os/Handler.html

所以在你的主類:

private final const int SWITCH_TEXT_CONTET=1; 
private Handler handler; 
protected void onCreate(...){ 
handler=new Handler(){ 
@Override 
public void handleMessage(Message msg) { 
if(msg==SWITCH_TEXT_CONTENT) 
textView.setText(..); 

,並在你的可運行:Runnable r1=....(){ bla bla , your code... and then handler.sendEmptyMessage(SWITCH_TEXT_CONTENT);} 在這裏你去嘗試這個工作就像一個瑞士手錶

+0

問題已更新,您提供了@Alex – user1885868

+0

更新了答案的ThreadPoolExecutor測試 – Alex