Android 如何在数组的每次迭代后添加一些延迟,每次迭代都会更改视图';这是我的财产。安卓
假设我有一个字符数组(mCharArray)和一个文本视图(tvChar),它是整个屏幕的大小。我希望,当用户单击屏幕(tvChar)时,textView会显示Charray中的每个字符,但是在每次迭代中应该有1秒的延迟。如何做到这一点 这是我目前的解决方案。此代码段来自片段的onViewCreated部分。问题是,文本不会更新,它只适用于char数组的最后一个元素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
@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。通常,您只需创建自己的处理程序。