2012-07-18 69 views
0

我正在嘗試更新兩個TextViews txtName和textEndName。當我調試有時會更新文本,但其餘時間不起作用。有時它可以工作,但並不完全是它假設的。下面給出的代碼中的問題是什麼?爲什麼處理程序中的文本沒有更新?

txtName = (TextView) findViewById(R.id.txtstarttag); 
    textEndName = (TextView) findViewById(R.id.txtendtag); 
    startSec = (TextView) findViewById(R.id.txtstartsecnd); 
    endSec = (TextView) findViewById(R.id.txtendsecnd); 
    btnplay = (ImageButton) findViewById(R.id.btnplay); 
    btnback = (Button) findViewById(R.id.btnback); 
    btnback.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      ((MyMixes) getParent()).goBack(); 
     } 
    }); 

    btnplay.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      btnClick(); 
     } 
    }); 

    splitArray(); 

    Thread t = new Thread() 
    { 
     public void run() 
     { 
      while (isDownloading) 
      { 
       if (Data.filenames != null && Data.filenames.size() >= (getIntent() .getExtras().getInt("index") + 1) && Data.filenames.get(getIntent().getExtras() .getInt("index")) != null) 
       { 
        try 
        { 
         mediaPlayer = new MediaPlayer(); 
         mediaPlayer.setDataSource(Data.filenames.get(getIntent().getExtras().getInt("index"))); 
         mediaPlayer.prepare(); 
         mediaPlayer.start(); 
         Timer t = new Timer(); 

         handler.postDelayed(onEverySecond, 1000); 
         mediaPlayer.setOnCompletionListener(new OnCompletionListener() 
         { 
          @Override 
          public void onCompletion(MediaPlayer mp) { 
           mediaPlayer.seekTo(0); 
          } 
         }); 
         boolean isPlaying = mediaPlayer.isPlaying(); 
         if(!isPlaying){ 
          mediaPlayer.pause(); 

         } 
        } catch (IllegalArgumentException e) { 
         e.printStackTrace(); 
        } catch (IllegalStateException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } finally { 
         isDownloading = false; 
        } 
       } 
      } 
     } 
    }; 
    t.start(); 
} 

private Runnable onEverySecond=new Runnable() 
{ 
    public void run() 
    { 
     if (mediaPlayer.isPlaying()) 
     { 
      for (int i = index; i < intervals.length; i++) 
      { 
       if (i != index && mediaPlayer.getCurrentPosition() > intervals[i]) 
       { 
        index = i; 
        handler.dispatchMessage(handler.obtainMessage()); 
        handler.postDelayed(onEverySecond, 1000); 
        break; 
       } 
      } 
     } 
    } 
}; 

Handler handler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) { 
     txtName.setText(arrName.get(index)); 
     textEndName.setText(arrName.get(index+1)); 
     super.handleMessage(msg); 
    } 
}; 

public void splitArray() 
{ 

    strSplit = kggg.split("\n");// string array 
    intervals = new long[strSplit.length]; 
    Time timer; 

    for (int j = 0; j < strSplit.length; j++) 
    { 
     split = strSplit[j];// string 
     split1 = split.split("-");// string array 

     arrName.add(split1[0]); 
     String timeq = split1[1]; 

     String[] timed = timeq.split(":"); 

     if(timed.length == 3) 
     { 
      timer = new Time(Integer.parseInt(timed[0].trim()), Integer.parseInt(timed[1].trim()), Integer.parseInt(timed[2].trim())); 
      intervals[j] = timer.getTime(); 
     } 
     else if(timed.length == 2) 
     { 
      timer = new Time(0, Integer.parseInt(timed[0].trim()), Integer.parseInt(timed[1].trim())); 
      intervals[j] = timer.getTime(); 
     } 
     else if(timed.length == 1) 
     { 
      timer = new Time(0, 0, Integer.parseInt(timed[0].trim())); 
      intervals[j] = timer.getTime(); 
     } 
    } 

    for (int j = intervals.length-1; j >= 0 ; j--) 
    { 
     intervals[j] = intervals[j] - intervals[0]; 
    } 
} 
public void btnClick() 
{ 
    k++; 
    k = k % 2; 
    startSong(k); 
} 
private void startSong(int i) { 
    if (i == 1) { 
     System.out.println("11111" + i); 
     btnplay.setImageResource(R.drawable.pause); 
     try { 
      System.out.println("start try chech------"); 
      mediaPlayer.start(); 
     } catch (Exception e) { 
      mediaPlayer.pause(); 
     } 
    } 
    if (i == 0) { 
     btnplay.setImageResource(R.drawable.play); 
     mediaPlayer.pause(); 
     System.out.println("00000" + i); 
    } 
} 

回答

0

你不應該這樣做:

handler.dispatchMessage(handler.obtainMessage()); 

試試這個:

handler.sendMessage(handler.obtainMessage()); 

編輯:添加其他東西,我注意到

我也看到,在你的線程中,你有一個循環while (isDownloading)並且你設置了在finally區塊中的到false。這個循環雖然永遠不會運行多次。

而且,你做

btnplay.setImageResource(R.drawable.play); 

一個THEAD內。這不好。您需要在主(UI)線程上完成與UI相關的所有操作。

+0

它不工作............ – bkshukla 2012-07-19 11:55:35

+0

請添加一些調試日誌記錄,以便您可以判斷Runnable是否正在多次運行並且還調用了handleMessage()方法 – 2012-07-19 12:54:19

+0

何時我正在調試,然後一切工作正常,但是當我運行同一段代碼的文本不更新。請建議做什麼?我在線程中使用計時器,與此有關嗎? – bkshukla 2012-07-19 13:06:36

相關問題