2013-04-17 24 views
4

我在两个不同的类中编写代码。第一个运行IOIO线程,它读取IOIO板的引脚状态;当此线程运行时,它将更新其他类(Tab3Activity.java)上的几个TextView。如何在静态方法中使用“runOnUiThread(runnable)”?

我调用方法来更新UI,就像下面的代码一样。

Tab3Activity.setText(index,"string here"); 

上述需要是静态的setText()否则它给出了一个ERR

不能使从型Tab3Activity

静态参考非静态方法的setText(INT,字符串)

问题出在Tab3Activity.java上。

public static void setText(final int idx,final String str) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      _textview[idx].setText(str); 
     } 
    }); 
} 

runOnUiThread上面给出了一个错误。

无法从活动类型

这是写在Globalioio.java的IOIO线程代码,使静态参考非静态方法runOnUiThread(Runnable接口),我试图更新Tab3Activity.java上的UI。看看Loop()的方法。

class Looper extends BaseIOIOLooper { 

    @Override 
    public void setup() throws ConnectionLostException { 
     //setup DigitalOutputs, AnalogInputs etc here. 
     if(Tab2Activity.isOpened==true){ 
      led_ = ioio_.openDigitalOutput(0, true); 

      pwm1S = ioio_.openPwmOutput(10, 100); 
      pwm1S.setDutyCycle((float)Tab2Activity.pwm1Speed.getProgress()/100); 
      pwm1Move = ioio_.openDigitalOutput(11, false); 

      pwm2S = ioio_.openPwmOutput(12, 100); 
      pwm2S.setDutyCycle((float)Tab2Activity.pwm2Speed.getProgress()/100); 
      pwm2Move = ioio_.openDigitalOutput(13, false); 

      pwmSrvo1 = ioio_.openPwmOutput(26, 100); 
      pwmSrvo1.setDutyCycle((float)Tab2Activity.servo1.getProgress()/100); 
      pwmSrvo2 = ioio_.openPwmOutput(27, 100); 
      pwmSrvo2.setDutyCycle((float)Tab2Activity.servo2.getProgress()/100); 
     } 
     if(Tab3Activity.isOpened==true){ 
      sensor1 = ioio_.openAnalogInput(41); 
      sensor2 = ioio_.openAnalogInput(42); 
      for(int i = 0;i<30;i++){ 
        dInput[i] = ioio_.openDigitalInput(DIGITAL_SENSOR_PIN[i]); 
      } 
      for(int i = 0; i<10;i++){ 
       aInput[i] = ioio_.openAnalogInput(ANALOG_SENSOR_PIN[i]); 
      } 
     } 

     connStatus=true; 
    } 

    @Override 
    public void loop() throws ConnectionLostException { 
     try { 
      if(Tab3Activity.slideDrawer2.isOpened()==true){ 
       final float range1 = (float)(2914/(sensor1.read() * 675.18+5))-1; 
       Tab3Activity.setSeekBarSensor(0,(int) (range1)); 
       Tab3Activity.setTextSensor(0,Float.toString((range1))); 
       final float range2 = (float)(2914/(sensor2.read() * 675.18+5))-1; 
       Tab3Activity.setSeekBarSensor(1,(int) (range2)); 
       Tab3Activity.setTextSensor(1,Float.toString(range2)); 

      } 
      if(Tab3Activity.slideDrawer1.isOpened()==true){ 
       if(Tab3Activity.pinsGroup==0){ 
        int idx =0; 
        for(int i = 0;i<10;i++){ 
         final boolean readingD = dInput[i].read(); 
         if(readingD==true){ 
          Tab3Activity.setSeekBar(idx,(int) (100)); 
         }else{ 
          Tab3Activity.setSeekBar(idx,(int) (0)); 
         } 
         Tab3Activity.setText(idx,Boolean.toString(readingD)); 
         idx++; 
        } 
       }else if(Tab3Activity.pinsGroup==1){ 
        int idx =0; 
        for(int i = 10;i<20;i++){ 
          final boolean readingD = dInput[i].read(); 
          if(readingD==true){ 
           Tab3Activity.setSeekBar(idx,(int) (100)); 
          }else{ 
           Tab3Activity.setSeekBar(idx,(int) (0)); 
          } 
          Tab3Activity.setText(idx,Boolean.toString(readingD)); 
          idx++; 
         } 
       }else if(Tab3Activity.pinsGroup==2){ 
        int idx=0; 
        for(int i = 20;i<30;i++){ 
          final boolean readingD = dInput[i].read(); 
          if(readingD==true){ 
           Tab3Activity.setSeekBar(idx,(int) (100)); 
          }else{ 
           Tab3Activity.setSeekBar(idx,(int) (0)); 
          } 
          Tab3Activity.setText(idx,Boolean.toString(readingD)); 
          idx++; 
        } 
       }else if(Tab3Activity.pinsGroup==3){ 
        int idx=0; 
        for(int i = 0;i<10;i++){ 
         final float readingA = aInput[i].read(); 
         Tab3Activity.setSeekBar(idx,(int) (readingA * 100)); 
         Tab3Activity.setText(idx,Float.toString((readingA * 100))); 
         idx++; 
        } 
       } 
      } 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      ioio_.disconnect(); 
     } catch (ConnectionLostException e) { 
      throw e; 
     } 
    } 
} 




@Override 
public IOIOLooper createIOIOLooper(String arg0, Object arg1) { 
    // TODO Auto-generated method stub 
    return new Looper(); 
} 

有没有其他办法可以做到这一点? 请给出一个简单的,我很新的android。在此先感谢

+0

当它不是静态时会得到什么错误? (也许这是真正的问题。) – 11684

+0

“无法从类型Tab3Activity” 对非静态方法setText(int,String)进行静态引用,这表明我将该方法更改为静态方法 –

回答

8

如果该线程从同一活动时间内

然后您可以将活动的引用传递给线程,并从该方法中移除静态。

YourThread thread = new YourThread(yourActivity); 
thread.start(); 

//YourThread 
public class YourThread extends Thread 
{ 
    Tab3Activity activity; 
    public YourThread(Tab3Activity activity) 
    { 
     Tab3Activity.activity = activity; 
    } 

... 
    activity.setText(index,"string here"); 
... 
} 

注:确保您的活动有机器人:configChanges = “方向| keyboardHidden |屏幕尺寸”。否则,当你旋转你的设备时,会出现一个新的活动实例。

如果你的活动没有启动该线程

那么你不应该试图直接通过静态方法访问活动。

如果你确信你的实现,并且如果它不会导致内存泄漏或崩溃那就试试这个

在您的活动或任何地方创建一个静态MainLooper处理程序。

public static Handler UIHandler = new Handler(Looper.getMainLooper()); 

现在,您可以使用此处理程序在ui线程上运行。

public static void setText(final int idx,final String str) { 
    UIHandler.post(new Runnable() { 
     @Override 
     public void run() { 
      _textview[idx].setText(str); 
     } 
    }); 
} 
0

是有,

你之间的耦合您ThreadActivity这是不是一个很好的设计,

改用Intent当线程完成I/O火意图和catch此活动

相关问题