-1

私は毎秒バックグラウンドを変更しようとしています。これが私のコードです。packagecom.example.splasher;

import java.lang.reflect.Field;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Typeface;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

public class Views extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.view);
            final ScrollTextView scrolltext=(ScrollTextView) findViewById(R.id.scrolltext);
                if(MainActivity.bold.isChecked())
                    {
                    scrolltext.setTypeface(null, Typeface.BOLD);
                    };
                if(MainActivity.italic.isChecked())
                    {
                    scrolltext.setTypeface(null, Typeface.ITALIC);
                    };
                if((MainActivity.italic.isChecked())&&(MainActivity.bold.isChecked()))
                    {
                    scrolltext.setTypeface(null, Typeface.BOLD_ITALIC);
                    };
            scrolltext.setTextSize(Integer.parseInt(MainActivity.tSize[MainActivity.Size.getSelectedItemPosition()]));
            scrolltext.setText(MainActivity.text);
            scrolltext.setTextColor(Integer.parseInt(MainActivity.colour[MainActivity.TextColour.getSelectedItemPosition()]));
            scrolltext.startScroll();
            scrolltext.setBackgroundColor(Integer.parseInt(MainActivity.colour[MainActivity.BackgroundColour.getSelectedItemPosition()]));
                Thread thread = new Thread()
                    {
                    public void run()
                        {
                        if(MainActivity.random.isChecked())
                            {
                            int delay = 0; // delay for 5 sec.
                            int period = 1000; // repeat every sec.
                            Timer timer = new Timer();
                            timer.scheduleAtFixedRate(new TimerTask() {
                            int n=1;
                                public void run() {if (n==9)n=1;
                                scrolltext.setBackgroundColor(Integer.parseInt(MainActivity.colour[n]));
                                }
                            }, delay, period);
                                        /*int n=1;
                                        boolean constant=true;
                                        while (constant==true){
                                        if (n==10) n=1;
                                        //   int randInt = new Random().nextInt(2);
                                        //   scrolltext.setBackgroundColor(Integer.parseInt(MainActivity.colour[randInt]));
                                        scrolltext.setBackgroundColor(Integer.parseInt(MainActivity.colour[n]));
                                        n=n+1;
                                        try
                                        {
                                        Thread.sleep(2000); // 1 second
                                        } catch (Exception e)
                                        {
                                        e.printStackTrace();
                                        }
                                        }*/ 
                            }
                        }
                    };
                thread.start();
                                        //      TextView textview=(TextView) findViewById (R.id.textView1); 
                                        //          textview.setText(MainActivity.text);
                                        //  textview.setTextColor(Integer.parseInt(MainActivity.colour[MainActivity.TextColour.getSelectedItemPosition()]));
                                        //          textview.setBackgroundColor(Integer.parseInt(MainActivity.colour[MainActivity.BackgroundColour.getSelectedItemPosition()]));
                                        //     textview.setTextSize(Integer.parseInt(MainActivity.tSize[MainActivity.Size.getSelectedItemPosition()]));
                                        //    textview.setSelected(true);
    }
}

しかし、それは強制的に閉じます。Logcatの表示:致命的な例外:タイマー-0; android.view.ViewRootŲcalledfromwrongThreadException:ビュー階層を作成した元の脅威のみがそのビューにアクセスできます。このコードの何が問題になっていますか?

4

3 に答える 3

2

scrolltext.setBackgroundColor()いわゆるUI thread(基本的に同じスレッドが実行される) スレッドとは別のスレッドでUI 要素 ( call など) を操作することはできませんonCreate()

問題を解決するには、Handlerを使用します。クラス フィールドを作成します。

Handler handler = new Handler();

スレッドでは、すべての UI 操作を Handler 呼び出し内に配置します。

handler.post(new Runnable() {
    @Override
    public void run () {
      // All UI operations, like scrolltext.setBackgroundColor()
    }
}); 
于 2013-03-17T21:48:21.070 に答える
1

あなたの問題は

scrolltext.setBackgroundColor(Integer.parseInt(MainActivity.colour[n]));

UIワーカー スレッド (UI スレッドでは実行されません) から更新していますが、これは許可されていません。UI で操作できるのは、メイン (UI) スレッドのみです。

runOnUiThread()したがって、またはに変更する必要がありますHandler

例:

runOnUiThread(new Runnable(){
   public void run() {
      // do your stuff
   }
});

ハンドラーの例

于 2013-03-17T21:46:56.887 に答える
0

ここに貢献しようとしているだけですが、私はアンドロイドの経験がありませんので、注意してください;p

例外メッセージは、メインスレッドでのみビューを変更できることを示唆しているようです。新しいスレッドでビューを変更するコードを実行しているので、それは好きではありません。

Android で使用されるメインの Event-Dispatcher スレッドを知っていますか? EDT で SWING の GUI が更新される方法と同様です。その場合は、メインの描画スレッドに最終的な更新を行うように指示する方法を探してください。

Swing では、次のようになります。

EventQueue.invokeLater(new Runnable(){
              public void run(){
    }
}

これが何らかの意味を持っていることを願っています。

于 2013-03-17T21:52:05.170 に答える