【问题标题】:Viewroot Called From Wrong Thread Exception从错误的线程异常调用 Viewroot
【发布时间】:2013-06-24 20:00:07
【问题描述】:

我想定期调用函数 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);
    }

【问题讨论】:

    标签: viewroot


    【解决方案1】:

    您的方法 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”中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多