假设我有一个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();
}
}
}
}
答案 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#post
或View#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);
}
});