2012-07-18 2 views
0

Я пытаюсь обновить два txtName TextViews и 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()); 

EDIT: Добавлены другие вещи, которые я заметил

Я также вижу, что в вашей теме у вас есть петля while (isDownloading), и вы установили isDownloading - false в блоке finally. Этот цикл никогда не запускается более одного раза.

Кроме того, вы

btnplay.setImageResource(R.drawable.play); 

внутри THEAD. Это плохо. Вам нужно сделать все, что связано с пользовательским интерфейсом в основном потоке (UI).

+0

Его не работает ............ – bkshukla

+0

, пожалуйста, добавьте некоторое отладочное ведение журнала, чтобы вы могли определить, запускается ли Runnable несколько раз, а также если метод handleMessage() вызывается –

+0

Когда я отлаживаю, тогда все работает нормально, но когда я запускаю один и тот же фрагмент кода, тексты не обновляются. Пожалуйста, предложите, что делать? Я использую таймер внутри потока, что-то с этим связано? – bkshukla

Смежные вопросы