假設(shè)我有ImageView一個(gè)單擊 a 即可執(zhí)行的操作Button: final ImageView ball = new ImageView(v.getContext()); ball.setImageResource(R.drawable.ball_1); gameConstraintLayout.addView(ball);當(dāng)我單擊該按鈕時(shí),它首先使球出現(xiàn),創(chuàng)建并運(yùn)行另一個(gè)線(xiàn)程,告訴自己休眠 1000 毫秒,sleep(long millis)然后通過(guò)調(diào)用移除球ConstrainLayout.removeView(view)這是完整的最小代碼: final ImageView ball = new ImageView(v.getContext()); currentBullet.setImageResource(R.drawable.ball_1); gameConstraintLayout.addView(ball); ballAppears.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { final ImageView ball = new ImageView(v.getContext()); currentBullet.setImageResource(R.drawable.ball_1); gameConstraintLayout.addView(ball); Thread thread = new Thread() { @Override public void run() { try { sleep(1000); contraintLayout.removeView(ball) } catch (InterruptedException e) { e.printStackTrace(); } }); } });問(wèn)題是;球出現(xiàn)在屏幕上,另一個(gè)線(xiàn)程成功休眠了 1000 毫秒,但是,當(dāng)它試圖從另一個(gè)線(xiàn)程的約束布局中移除球時(shí),它崩潰了。日志貓: android.view.ViewRootImpl$CalledFromWrongThreadException: **Only the original thread that created a view hierarchy can touch its views**. at android.support.constraint.ConstraintLayout.removeView(ConstraintLayout.java:645) at com.mobilegames.***.******.GameActivity$1$1.run(GameActivity.java:51)導(dǎo)致問(wèn)題的代碼是:gameConstraintLayout.removeView(ball_1);看起來(lái),我無(wú)法從另一個(gè)線(xiàn)程訪(fǎng)問(wèn)約束布局,但是,我仍然可以更改球的 X 和 Y。我什至嘗試在 UI theard 中運(yùn)行那段代碼runOnUIThread(...),但無(wú)濟(jì)于事。任何可能的解決方案?請(qǐng)記住,我每秒都會(huì)更改球的 X 和 Y。是的,我確實(shí)檢查了其他問(wèn)題。那些答案中說(shuō)只是在 UI 線(xiàn)程上運(yùn)行它,但當(dāng)然我已經(jīng)嘗試過(guò)了。如果我將睡眠(長(zhǎng)毫秒)運(yùn)行到 UI 線(xiàn)程中,顯然,整個(gè)應(yīng)用程序?qū)⑹遣回?fù)責(zé)任的。(這不是完整的應(yīng)用程序;它被分解為一個(gè)更簡(jiǎn)單易懂的問(wèn)題。我最終在單獨(dú)的線(xiàn)程中更改了球的 X 和 Y,但這就是導(dǎo)致問(wèn)題的原因。請(qǐng)?jiān)谠u(píng)論中告訴我,如果需要編輯)抱歉小語(yǔ)法錯(cuò)誤
1 回答

ABOUTYOU
TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
使用處理程序延遲執(zhí)行您的操作。例如:
Handler h = new Handler();
h.postDelayed(new Runnable() {
public void run() {
gameConstraintLayout.removeView(currentBullet);
}
}, 1000); // here 1000 is delay in milliseconds (1sec)
添加回答
舉報(bào)
0/150
提交
取消