2013-06-24 38 views
0

我想定期调用函数p(),我已经使用了scheduledatfixedrate方法。当我运行代码时,我在日志中看到“Viewroot从错误线程异常中调用”。我在函数调用中加入了onuithread实现来解决这个问题,但它没用。Viewroot从错误线程异常调用

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); 
    } 

回答

0

您的方法p()正在UI线程上运行。但是,你的Timer“t”有它自己的线程,所以TimerTask“tt”不在UI线程上执行;它在TimerTask线程中执行。为了解决这个问题,你可以运行P()关闭UI线程和有你的TimerTask TT执行的UI线程上运行一个Runnable:

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

然后把所有的逻辑和视图操作中可运行“touchViews。 “

相关问题