【问题标题】:Handler & Runnable for Android TimerAndroid Timer 的处理程序和可运行程序
【发布时间】:2015-07-07 20:03:06
【问题描述】:

我试图在TextView 中显示一个String 数组,一次一个项目,每次以毫秒为单位的间隔结束。我被推荐了这个代码:

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() 出于某种原因在 Android 中工作得非常糟糕。我很确定问题不在我的拆分器中,因为如果我评论涉及运行可运行文件的行,它不会崩溃或抛出任何异常。 这是我的日志:

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)

提前致谢。

【问题讨论】:

  • 您似乎试图访问超出范围的值

标签: java android handler runnable android-handler


【解决方案1】:

您的读取功能超出了范围。如果它在界限内,你没有检查任何东西,只是递增。

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

但如果我正确理解您的问题,您应该使用TextSwitcher,您可以找到示例here。你也可以给它添加一些很酷的动画。

【讨论】:

  • 好的 :) 谷歌一下如何添加一些花哨的动画让它看起来很棒:)
猜你喜欢
  • 2015-04-21
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
相关资源
最近更新 更多