Android 如何在数组的每次迭代后添加一些延迟,每次迭代都会更改视图';这是我的财产。安卓

Android 如何在数组的每次迭代后添加一些延迟,每次迭代都会更改视图';这是我的财产。安卓,android,arrays,multithreading,wait,postdelayed,Android,Arrays,Multithreading,Wait,Postdelayed,假设我有一个字符数组(mCharArray)和一个文本视图(tvChar),它是整个屏幕的大小。我希望,当用户单击屏幕(tvChar)时,textView会显示Charray中的每个字符,但是在每次迭代中应该有1秒的延迟。如何做到这一点 这是我目前的解决方案。此代码段来自片段的onViewCreated部分。问题是,文本不会更新,它只适用于char数组的最后一个元素 @Override public void onViewCreated(View view, Bundle savedInstan

假设我有一个字符数组(mCharArray)和一个文本视图(tvChar),它是整个屏幕的大小。我希望,当用户单击屏幕(tvChar)时,textView会显示Charray中的每个字符,但是在每次迭代中应该有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();
            }
        }
    }
}

您可以在单击方法中尝试类似的方法。每个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)); 
    }
for(int i=0;i
它不会更新,因为您正在主线程上睡觉。无论何时使用
View#post
View#postDelayed
时,实际上是将代码提供给在主UI线程上运行runnable的视图支持的
处理程序。因为您睡在主线程上,所以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);
        }
    });

这其中的缺陷是它实际上并没有取消更新,因为你可以很快按下按钮,然后你会开始发布很多很多无法取消的Runnable。通常,您只需创建自己的处理程序。