Androidアプリで作業していて、30秒ごとにバックグラウンドを更新したいと考えています。2回目のタイマーでアプリがクラッシュする
私はタイマーを使用していましたが、動作しますが、1回だけです!アプリがクラッシュする2回目。
public Timer mTimer = null;
public void loadColor()
{
setContentView(R.layout.color);
cur_scr = (LinearLayout) findViewById(R.id.colorScreen);
}
public void onClick(View v) throws InterruptedException
{
int id = v.getId();
switch (id)
{
case R.id.nextColor:
loadColor();
mTimer = new Timer();
mTimer.scheduleAtFixedRate(new TimerTask()
{
public void run()
{
Random gen = new Random();
cur_scr.setBackgroundColor(Color.argb(255, gen.nextInt(256), gen.nextInt(256), gen.nextInt(256)));
}
}, 0, 2000);
break;
}
}
LOGCAT:
05-10 15:46:12.325: W/dalvikvm(346): threadid=9: thread exiting with uncaught exception (group=0x40015560)
05-10 15:46:12.344: E/AndroidRuntime(346): FATAL EXCEPTION: Timer-0
05-10 15:46:12.344: E/AndroidRuntime(346): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
05-10 15:46:12.344: E/AndroidRuntime(346): at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
05-10 15:46:12.344: E/AndroidRuntime(346): at android.view.ViewRoot.invalidateChild(ViewRoot.java:642)
05-10 15:46:12.344: E/AndroidRuntime(346): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668)
05-10 15:46:12.344: E/AndroidRuntime(346): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
05-10 15:46:12.344: E/AndroidRuntime(346): at android.view.View.invalidate(View.java:5279)
05-10 15:46:12.344: E/AndroidRuntime(346): at android.view.View.setBackgroundDrawable(View.java:7626)
05-10 15:46:12.344: E/AndroidRuntime(346): at android.view.View.setBackgroundColor(View.java:7516)
05-10 15:46:12.344: E/AndroidRuntime(346): at com.haxad0x.tools.Core$1.run(Core.java:162)
05-10 15:46:12.344: E/AndroidRuntime(346): at java.util.Timer$TimerImpl.run(Timer.java:284)
05-10 15:46:14.194: D/AndroidRuntime(346): Shutting down VM
05-10 15:46:14.194: W/dalvikvm(346): threadid=1: thread exiting with uncaught exception (group=0x40015560)
05-10 15:46:14.194: I/Process(346): Sending signal. PID: 346 SIG: 9
私を助けてください!みんなありがとう!
case R.id.nextColor:
loadColor();
mTimer = new Timer();
mTimer.scheduleAtFixedRate(new TimerTask()
{
public void run()
{
runOnUiThread(new Runnable()
{
public void run() {
Random gen = new Random();
cur_scr.setBackgroundColor(Color.argb(255, gen.nextInt(256), gen.nextInt(256), gen.nextInt(256)));
}
});
}
}, 0, 2000);
break;
コードはこのように動作します。私はそれについて1つの質問しか持っていません:それは長いコードですか?というのは;すべてのボイドのためにパフォーマンスに影響を及ぼしますか?それを短くすることはできますか?
ログカットであなたに伝えるエラーメッセージは...?また、30秒ごとにfindViewById()を呼び出そうとしないでください。これは比較的高価なメソッドで、onCreate()の中で一度呼び出すだけで、参照を保持し、その参照に必要な回数だけ.setBackgroundcolor()を呼び出すだけです。 – FoamyGuy
本当にちょうど私のソリューションを使用して、それを働かせて、あなたのコードとして投稿してください、私の投稿を投票しない、または受け入れたことをマークして、投稿を改善する方法を明確に投稿したとき、 –