-1

我正在尝试每秒更改背景,这是我的代码:package com.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 显示:FATAL EXCEPTION: Timer-0;android.view.ViewRootŲcalledfromwrongThreadException:只有创建视图层次结构的原始威胁才能触及其视图。这段代码有什么问题?

4

3 回答 3

2

您不能在与scrolltext.setBackgroundColor()所谓的UI thread(基本上是同一个线程onCreate()运行的线程)分开的线程中对 UI 元素(如 call )进行操作。

要解决您的问题,请使用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 线程上运行),这是不允许的。只有 Main(UI) 线程可以使用 UI 进行操作。

因此,您需要将其更改为runOnUiThread()or Handler

例子:

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

处理程序示例

于 2013-03-17T21:46:56.887 回答
0

只是想在这里做出贡献,但我在 android 方面的经验为零,所以要小心;p

异常消息似乎表明只能在主线程上更改视图。当您正在运行更改新线程上的视图的代码时,它不喜欢它。

您知道 Android 中使用的主要 Event-Dispatcher 线程吗?类似于在 EDT 上更新 SWINGs GUI 的方式。如果是这样,请寻找一种方法来告诉绘图线程进行最终更新。

在摇摆中,它看起来像:

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

希望这有一些意义。

于 2013-03-17T21:52:05.170 回答