我使用Toast.makeText打印一个数组的Number。但是,当我在for循环中使用它时。它只打印第一个数字,而没有做其他任何事情。
答案 0 :(得分:1)
重要:Android中的Toast的持续时间有两种:
Toast.LENGTH_SHORT
,Toast.LENGTH_LONG
,但是它们都比一个循环执行甚至整个循环慢。因此,在这种情况下,系统可能会打印第一个数字并等待,直到Toast消失或覆盖所有现有的Toast,然后打印最后一个数字或一个随机数字。
有几种处理方法:
如果您需要查看自己的数字,可以使用:
Log.i("My Array Loop", "position: " + position + " value: " + array.get(position));
//check your Logcat for values
如果要将它们作为Toast显示给用户,则可以使用Handler
或Timer
来实现,但是我更喜欢使用Handler
,因为它是更有效:
创建一个帮助器类以提高灵活性:
public class ToastPrintHelper {
private Context context;
private ArrayList<Integer> list;
private int currentPosition = 0;
public ToastPrintHelper(Context context, ArrayList<Integer> list) {
this.context = context;
this.list = list;
}
public void printValuesEvery(final long periodInMillis) {
final Handler printHandler = new Handler();
//initialize your print runnable
Runnable printRunnable = new Runnable() {
@Override
public void run() {
//print your toast
Toast.makeText(
context,
"position :" + currentPosition + " value: " + list.get(currentPosition),
Toast.LENGTH_SHORT).show();
//repeat if there are still items to show
if (currentPosition < list.size() -1) {
currentPosition++;
//execute your runnable again but for a delay
printHandler.postDelayed(this, periodInMillis);
}
}
};
//execute your runnable without delay for the first time
printHandler.post(printRunnable);
}
}
以这种方式初始化您的班级:
ToastPrintHelper printHelper = new ToastPrintHelper(context, list);
每秒钟打印一次值(1000毫秒)
printHelper.printValuesEvery(1000);
在这种情况下,我更喜欢将AlertDialog
与ProgressBar
和TextView
结合使用,以使其对用户更加可见并提高UX / UI质量
注意:该代码未经测试,但我相信它没有错误。也可以更好地简化它。
快乐编码!
答案 1 :(得分:0)
如果没有延迟,则连续运行的循环无法在视图上执行此类操作。调试代码,然后查看代码是否达到每个迭代编号或Log
迭代编号。另外,在每次迭代中显示吐司都会阻塞您的UI线程。您可以使用Handler
来延迟查看Toast
和迭代次数,如下所示:
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Show toast
Toast.makeText(this, "Iteration Number:" + i, Toast.LENGTH_SHORT).show();
//Show toast in about 5 seconds
handler.postDelayed(this, 5000);
}
}, 5000);