如何在每次迭代数组后添加一些延迟,每次迭代都会改变视图的属性。 Android的

时间:2015-02-03 05:07:15

标签: android arrays multithreading wait postdelayed

假设我有一个char数组(mCharArray)和一个textView(tvChar),它是整个屏幕的大小。我想要的是,当用户点击屏幕(tvChar)时,textView会显示charArray中的每个char,但是每次迭代都应该有1秒的延迟。如何做到这一点?

这是我当前的解决方案。这段代码片段来自片段的onViewCreated部分。问题是,文本没有更新,它只适用于char数组的最后一个元素。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    tvChar = (TextView) view.findViewById(R.id.tv_char);
    tvChar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // not sure how to pause after each iteration...
            v.postDelayed(new Runnable() {
                @Override
                public void run() {
                    for (char element : mCharArray) {
                        synchronized (tvChar) {
                            tvChar.setText(String.valueOf(element));

                            tvChar.notify();

                            try {
                                tvChar.wait(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }, 1000);
        }
    });
}

更新: 感谢所有的答案,虽然当我尝试它们时没有一个真的有用,但是你们帮助我一些直觉。

我最终在onCreate上添加了线程处理程序

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mCharArray = getArguments().getCharArray(SENTENCE_KEY);
    }

    handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            this.obtainMessage();
            tvChar.setText(Character.toString((char)msg.arg1));
        }
    };
}

在setOnclickListener

中创建一个新线程
tvChar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            thread = new Thread(new ChangeCharThread());
            thread.start();
        }
    });

创建一个实现runnable的内部类。

class ChangeCharThread implements Runnable{
    @Override
    public void run() {
        Message msg = Message.obtain();

        for (char ch : mCharArray){
            msg.arg1 = ch;

            handler.sendMessage(msg);

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以在Click方法中尝试与此类似的方法。每个UI更新进一步延迟一秒以同步行为。我们需要的是每次更新的时间表:

    for (int i= 0; i< mCharArray.length; i++) {
            EventDetail.handler.postDelayed(new Runnable()
            {
                public void run()
                {
                    tvChar.setText(String.valueOf(mCharArray[i]));
                }
            }, 1000 *(i+1)); 
    }

答案 1 :(得分:0)

它没有更新,因为你正在主线程上睡觉。每当您使用View#postView#postDelayed时,您实际上是将代码提供给在主UI线程上运行runnable的View支持的Handler。因为您正在主线程上休眠,所以UI永远不会被更新。在textview甚至再次绘制之前,你只是不断用新数据更新textview。

您需要做的不是循环遍历所有字符数组,而是执行以下操作:

boolean running
int count;
tvChar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (running) {
               running = false;
            } else {
               v.postDelayed(new Runnable() {
                 @Override
                 public void run() {
                    char element = mCharArray[count % mCharArray.length];
                    tvChar.setText(String.valueOf(element));
                    count++;
                    if (running) {
                      v.postDelayed(1000);
                    }
             }, 1000);
        }
    });