4

私は2つの異なるクラスでコードを書いています。最初のものは、IOIO ボードのピンの状態を読み取る IOIO スレッドを実行します。このスレッドが実行されると、他のクラス (Tab3Activity.java) にある複数の TextView が更新されます。

以下のコードのように、メソッドを呼び出して UI を更新しました。

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上記はエラーになります。

タイプ Activity から非静的メソッド 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();
}

これを行う代替手段はありますか?簡単なものを教えてください、私はアンドロイドにかなり慣れていません。前もって感謝します

4

2 に答える 2

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

注:アクティビティに android:configChanges="orientation|keyboardHidden|screenSize" があることを確認してください。そうしないと、デバイスを回転させると、アクティビティの新しいインスタンスが開始されます。

そして、あなたのアクティビティがそのスレッドを開始していない場合

その場合、静的メソッドを介してアクティビティに直接アクセスしようとしないでください。

実装に自信があり、メモリ リークやクラッシュが発生しない場合は、これを試してください。

アクティビティまたは任意の場所に静的 MainLooper Handler を作成します。

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);
        }
    });
}
于 2013-04-17T14:28:27.423 に答える