私はAndroidアプリに取り組んでおり、30秒ごとに背景を更新したいと思っています。
私はタイマーを使用しました、そしてそれは働きます、しかし一度だけ!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つだけ質問があります:それは長いコードですか?つまり; すべてのボイドのためにパフォーマンスに影響しますか?それを短くすることはできますか?