2012-07-18 2 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.sendMessage(handler.obtainMessage()); 

편집 :이 대신 시도

handler.dispatchMessage(handler.obtainMessage()); 

을 추가 다른 것들 내가

가 나는 또한 것을 알 발견 귀하의 스레드에 while (isDownloading) 루프가 있고를 설정합니다. finally 블록의~ false 이 루프는 두 번 이상 실행되지 않습니다.

또한, 당신은 THEAD 내부

btnplay.setImageResource(R.drawable.play); 

을한다. 이것은 좋지 않다. 기본 (UI) 스레드에서 UI와 관련된 모든 작업을 수행해야합니다.

+0

작동하지 않습니다 ............ – bkshukla

+0

Runnable이 여러 번 실행되고 handleMessage() 메서드가 호출되는 경우 알 수 있도록 디버그 로깅을 추가하십시오 –

+0

나는 모든 일을 잘 디버깅 오전 그러나 동일한 코드 조각을 실행할 때 텍스트가 업데이트되지 않습니다. 할 일을 제안하십시오. 스레드 내에서 타이머를 사용하고 있는데, 그 일과 관련이 있습니까? – bkshukla

관련 문제