Java 如何使用;RunUnuithRead(可运行)“;内部静态方法?
我在两个不同的班上写代码。第一个运行IOIO线程,读取IOIO板的引脚状态;当这个线程运行时,它将更新另一个类(Tab3Activity.java)上的几个文本视图 我调用了这个方法来更新UI,就像下面的代码一样Java 如何使用;RunUnuithRead(可运行)“;内部静态方法?,java,android,eclipse,multithreading,static,Java,Android,Eclipse,Multithreading,Static,我在两个不同的班上写代码。第一个运行IOIO线程,读取IOIO板的引脚状态;当这个线程运行时,它将更新另一个类(Tab3Activity.java)上的几个文本视图 我调用了这个方法来更新UI,就像下面的代码一样 Tab3Activity.setText(index,"string here"); 上面的setText()必须是静态的,否则会出现错误 无法从类型Tab3Activity对非静态方法setText(int,String)进行静态引用 问题出在Tab3Activity.java上
Tab3Activity.setText(index,"string here");
上面的setText()
必须是静态的,否则会出现错误
无法从类型Tab3Activity对非静态方法setText(int,String)进行静态引用 问题出在Tab3Activity.java上
public static void setText(final int idx,final String str) {
runOnUiThread(new Runnable() {
@Override
public void run() {
_textview[idx].setText(str);
}
});
}
上面的runOnUiThread
给出了一个错误
无法从类型活动中对非静态方法runOnUiThread(Runnable)进行静态引用 这是用Globalioio.java编写的IOIO线程代码,我正在尝试更新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();
}
类循环器扩展了BaseIOIOLooper{
@凌驾
public void setup()引发ConnectionLostException{
//在此处设置数字输出、模拟输入等。
if(Tab2Activity.isOpened==true){
led=ioio。openDigitalOutput(0,真);
pwm1S=ioio_u2;openPwmOutput(10100);
pwm1S.setDutyCycle((float)Tab2Activity.pwm1Speed.getProgress()/100);
pwm1Move=ioio_u2;openDigitalOutput(11,false);
pwm2S=ioio_u2;openPwmOutput(12100);
pwm2S.setDutyCycle((float)Tab2Activity.pwm2Speed.getProgress()/100);
pwm2Move=ioio_u2;openDigitalOutput(13,false);
pwmSrvo1=ioio_u2;openPwmOutput(26100);
pwmSrvo1.setDutyCycle((float)Tab2Activity.servo1.getProgress()/100);
pwmSrvo2=ioio_u2;openPwmOutput(27100);
pwmSrvo2.setDutyCycle((float)Tab2Activity.servo2.getProgress()/100);
}
if(Tab3Activity.isOpened==true){
传感器1=输入输入(41);
sensor2=输入(42);
对于(inti=0;i是的
您的线程
与活动
之间存在耦合,这不是一个好的设计
相反,当线程完成I/O激发意图并在活动中捕获它时,使用Intent
如果此线程是从同一活动启动的
然后可以将活动的引用传递给线程,并从该方法中删除static
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");
...
}
注意:确保您的活动具有android:configChanges=“orientation | keyboardHidden | screenSize”。否则,当您旋转设备时,将启动新的活动实例
如果你的活动没有启动该线程
然后,您不应该尝试通过静态方法直接访问活动
如果您确信您的实现,并且它不会导致内存泄漏或崩溃,那么请尝试此方法
在活动中或任何位置创建静态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);
}
});
}
如果不是静态的,会出现什么错误?(可能这才是真正的问题。)“无法从类型Tab3Activity静态引用非静态方法setText(int,String)”建议我将该方法更改为静态方法