Android Studio Jellyfish运行Java循环异常求助
Android Jellyfish下循环调用Toast异常的解决办法
问题原因
你的代码在主线程中同步执行循环,连续调用Toast.show()会把所有Toast请求加入系统队列,但主线程被同步循环完全阻塞,后续Toast的UI渲染无法正常执行。加上Android Studio Jellyfish对应的AGP或系统对UI线程阻塞的检测更严格,导致只显示到i=3就无反应。
解决方法
方法一:用Handler实现异步循环(推荐)
通过Handler.postDelayed()让每个Toast延迟执行,避免阻塞主线程,保证所有Toast依次显示:
public void newGen(){ final int[] i = {0}; Handler handler = new Handler(Looper.getMainLooper()); Runnable showToastRunnable = new Runnable() { @Override public void run() { if (i[0] <= 10) { Toast.makeText(ViewActivity.this, "the value is " + i[0], Toast.LENGTH_LONG).show(); i[0]++; // 间隔2秒触发下一次,和LENGTH_LONG的显示时长匹配 handler.postDelayed(this, 2000); } } }; handler.post(showToastRunnable); }
方法二:复用单个Toast更新内容
如果不需要同时显示多个Toast,可复用同一个Toast对象实时更新文本(注意避免阻塞主线程):
public void newGen(){ Toast toast = Toast.makeText(ViewActivity.this, "", Toast.LENGTH_LONG); // 把循环放到子线程,避免阻塞主线程 new Thread(() -> { for (int i = 0; i <= 10; i++) { int finalI = i; // 回到主线程更新Toast文本并显示 runOnUiThread(() -> { toast.setText("the value is " + finalI); toast.show(); }); try { // 间隔2秒,保证Toast有足够时间显示 Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); }
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

