1

我想定期调用函数 p(),为此我使用了 scheduleatfixedrate 方法。当我运行代码时,我得到“从错误的线程异常调用的 Viewroot”,如日志中所示。我在函数调用中添加了 onuithread 实现来解决这个问题,但它没有用。

package com.example.flipper;

import java.io.IOException;

import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;


import android.os.Bundle;
import android.app.Activity;
import android.app.WallpaperManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ViewFlipper;

public class MainActivity extends Activity {

    Button n,p,apply;
    ImageView ivmain;
    int imageId;
    int i = 0;
    TimerTask tt;
    Timer t = new Timer();
    TextView t1;
    View v;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        n = (Button)findViewById(R.id.button1);
        p = (Button)findViewById(R.id.button2);
        apply = (Button)findViewById(R.id.button3);
        ivmain = (ImageView)findViewById(R.id.imageView1);
        ivmain.setImageResource(R.drawable.bangalorelogo);
        t1 = (TextView)findViewById(R.id.textView1);
        MainActivity.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                p();
            }




        });


}

public void p ()

    {
        tt = new TimerTask(){
            public void run()
            {

        Random r = new Random();
        i = r.nextInt(3);
        switch(i)
        {
        case 0:
            ivmain.setImageResource(R.drawable.chennailogo);
            break;
        case 1:
            ivmain.setImageResource(R.drawable.ic_launcher);
            break;
        case 2:
            ivmain.setImageResource(R.drawable.cscaptain);
            break;
        case 3:
            ivmain.setImageResource(R.drawable.chennailogo1);
        default:
            ivmain.setImageResource(R.drawable.ic_launcher);
            break;

        }
        t1.setText(""+i);

            }
        };
        t.scheduleAtFixedRate(tt, 2000, 1000);
    }
4

1 回答 1

0

您的方法 p() 正在 UI 线程上运行。但是,您的 Timer "t" 有它自己的线程,因此 TimerTask "tt" 不在 UI 线程上执行;它在 TimerTask 线程中执行。为了解决这个问题,您可以在 UI 线程上运行 p() 并让 TimerTask tt 执行在 UI 线程上运行的 Runnable:

tt = new TimerTask(){
            public void run()
            {new Runnable() { runOnUiThread(touchViews); } } }

然后将所有逻辑和视图操作放入 Runnable “touchViews”中。

于 2013-12-17T21:06:47.563 回答