2015-04-28 2 views
0

Я пытаюсь отобразить массив String в TextView, по одному элементу за раз, каждый раз, когда заканчивается интервал в миллисекундах. Я рекомендовал этот код:Handler & Runnable для Android Timer

package com.tt.blanker; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.widget.Button; 
import android.widget.TextView; 

import java.util.StringTokenizer; 

/** 
* Created by Gonzalo on 08/04/2015. 
*/ 
public class ReadActivity extends Activity { 
    int i; 
    int interval = 200; 
    String[] words; 
    TextView txt; 
    Handler handler = new Handler(); 
    Runnable rnb; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.read); 
     String x = getIntent().getExtras().getBundle("b").getString("text"); 
     words = splitter(x, " "); 
     rnb = new Runnable() { 
      @Override 
      public void run() { 
       read(); 
      } 
     }; 

     txt = (TextView) findViewById(R.id.word); 
     txt.setText(words[0]); 
     i=0; 
     Button fast = (Button) findViewById(R.id.fast); 
     Button slow = (Button) findViewById(R.id.slow); 
     Button big = (Button) findViewById(R.id.big); 
     Button small = (Button) findViewById(R.id.small); 
     Button play = (Button) findViewById(R.id.play); 
     rnb.run(); 
    } 

    public void read(){ 
     txt.setText(words[i]); 
     i++; 
     handler.postDelayed(rnb, interval); 
    } 

    public String[] splitter(String str, String regex){ 
     str=str.trim(); 
     String[] q; 
     int length=0; 
     for (int i=0; i<str.length(); i++){ 
      String rx=str.substring(i,i+1); 
      if(rx.equals(regex)){ 
       length++; 
      } 
     } 
     q = new String[length+1]; 
     for (int p=0; p<q.length; p++){ 
      q[p]=""; 
     } 
     int actualp=0; 
     for (int i=0; i<str.length(); i++){ 
      String rx=str.substring(i,i+1); 
      if(rx.equals(regex)){ 
       actualp++; 
      } 
      else{ 

       q[actualp]+=rx; 
      } 
     } 
     return q; 
    } 
} 

однако он не работает, он бросает ArrayIndexOutOfBoundsException. Мне пришлось повторно использовать метод split (см. Сплиттер) вручную, потому что split() ужасно работает в Android по какой-то причине. Я уверен, что проблема не в моем сплиттере, потому что, если я прокомментирую строки, связанные с запуском runnable, это не приведет к сбою или исключению каких-либо исключений. Вот мой LogCat:

04-28 16:05:51.436: E/AndroidRuntime(7789): in writeCrashedAppName, pkgName :com.tt.blanker 
04-28 16:05:51.436: D/AndroidRuntime(7789): file written successfully with content: com.tt.blanker StringBuffer : ;com.tt.blanker 
04-28 16:05:51.436: E/AndroidRuntime(7789): FATAL EXCEPTION: main 
04-28 16:05:51.436: E/AndroidRuntime(7789): Process: com.tt.blanker, PID: 7789 
04-28 16:05:51.436: E/AndroidRuntime(7789): java.lang.ArrayIndexOutOfBoundsException: length=4; index=4 
04-28 16:05:51.436: E/AndroidRuntime(7789):  at com.tt.blanker.ReadActivity.read(ReadActivity.java:48) 
04-28 16:05:51.436: E/AndroidRuntime(7789):  at com.tt.blanker.ReadActivity$1.run(ReadActivity.java:32) 
04-28 16:05:51.436: E/AndroidRuntime(7789):  at android.os.Handler.handleCallback(Handler.java:733) 
04-28 16:05:51.436: E/AndroidRuntime(7789):  at android.os.Handler.dispatchMessage(Handler.java:95) 
04-28 16:05:51.436: E/AndroidRuntime(7789):  at android.os.Looper.loop(Looper.java:136) 
04-28 16:05:51.436: E/AndroidRuntime(7789):  at android.app.ActivityThread.main(ActivityThread.java:5021) 
04-28 16:05:51.436: E/AndroidRuntime(7789):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-28 16:05:51.436: E/AndroidRuntime(7789):  at java.lang.reflect.Method.invoke(Method.java:515) 
04-28 16:05:51.436: E/AndroidRuntime(7789):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827) 
04-28 16:05:51.436: E/AndroidRuntime(7789):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643) 
04-28 16:05:51.436: E/AndroidRuntime(7789):  at dalvik.system.NativeStart.main(Native Method) 

Спасибо заранее.

+0

Кажется, вы пытались достичь значения, которое находится за пределами допустимого диапазона –

ответ

1

Вы вышли из-под контроля в своей функции чтения. Вы ничего не проверяли, если он находится в границах, просто увеличивая.

public void read(){ 
     if(i < words.length){ 
      txt.setText(words[i]); 
      i++; 
      handler.postDelayed(rnb, interval); 
     } 
    } 

Но если я понимаю вашу проблему правильно, вы должны использовать TextSwitcher, вы можете найти образец here. Вы можете добавить к нему довольно классные анимации.

+0

, проверяя, что TextSwitcher, спасибо, dude :) – OrangeWall

+0

Ok :) google немного, как добавить к нему несколько причудливых анимаций и заставить его выглядеть потрясающе :) –

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