2014-03-06 2 views
0

나는 끊임없이 호출되는 루프에 의해 업데이트되는 UI를 가지고있다. 그러나 그것은 수렁에 빠져있는 것처럼 보입니다. AsyncTask을 조금 더 빨리 사용하려면 어떻게해야합니까? 여기진행 막대를 업데이트하기 위해 AsyncTask를 설정하는 방법은 무엇입니까?

class Looper extends BaseIOIOLooper { 

    /** 
    * Called every time a connection with IOIO has been established. 
    * Typically used to open pins. 
    * 
    * @throws ConnectionLostException 
    *    When IOIO connection is lost. 
    * 
    * @see ioio.lib.util.AbstractIOIOActivity.IOIOThread#setup() 
    */ 
    @Override 
    protected void setup() throws ConnectionLostException { 
     led_ = ioio_.openDigitalOutput(0, true); 

     DO1 = ioio_.openDigitalOutput(6, false); 
     DO2 = ioio_.openDigitalOutput(7, false); 
     DO3 = ioio_.openDigitalOutput(8, false); 
     DO4 = ioio_.openDigitalOutput(9, false); 
     DO5 = ioio_.openDigitalOutput(10, false); 
     DO6 = ioio_.openDigitalOutput(11, false); 
     DO7 = ioio_.openDigitalOutput(12, false); 
     DO8 = ioio_.openDigitalOutput(13, false); 
     DO9 = ioio_.openDigitalOutput(14, false); 
     DO10 = ioio_.openDigitalOutput(15, false); 
     DO11 = ioio_.openDigitalOutput(16, false); 
     DO12 = ioio_.openDigitalOutput(17, false); 

     DI1 = ioio_.openDigitalInput(18); 
     DI2 = ioio_.openDigitalInput(19); 
     DI3 = ioio_.openDigitalInput(20); 
     DI4 = ioio_.openDigitalInput(21); 
     DI5 = ioio_.openDigitalInput(22); 
     DI6 = ioio_.openDigitalInput(23); 
     DI7 = ioio_.openDigitalInput(24); 
     DI8 = ioio_.openDigitalInput(25); 
     DI9 = ioio_.openDigitalInput(26); 

     AI1 = ioio_.openAnalogInput(31); 
     AI2 = ioio_.openAnalogInput(32); 
     AI3 = ioio_.openAnalogInput(33); 
     AI4 = ioio_.openAnalogInput(34); 
     AI5 = ioio_.openAnalogInput(35); 
     AI6 = ioio_.openAnalogInput(36); 
     AI7 = ioio_.openAnalogInput(37); 
     AI8 = ioio_.openAnalogInput(38); 
     AI9 = ioio_.openAnalogInput(39); 
     AI10 = ioio_.openAnalogInput(40); 
     AI11 = ioio_.openAnalogInput(41); 
     AI12 = ioio_.openAnalogInput(42); 
     AI13 = ioio_.openAnalogInput(43); 
     AI14 = ioio_.openAnalogInput(44); 
     AI15 = ioio_.openAnalogInput(45); 
     AI16 = ioio_.openAnalogInput(46); 
     /* 
     * for (int i = 0; i < DOA.length; i++) { DOA[i] = 
     * ioio_.openDigitalOutput(i + 6); } 
     */ 

     // for (int i = 0; i < DIA.length; i++) { 
     // DIA[i] = ioio_.openDigitalInput(i + 18); 
     // } 
     // for (int i = 0; i < PWMA.length; i++) { 
     // PWMA[i] = ioio_.openPwmOutput(i + 27, 10000); 
     // } 
     // 
     // for (int i = 0; i < AIA.length; i++) { 
     // AIA[i] = ioio_.openAnalogInput(i + 31); 
     // } 
     // TWIA[0] = ioio_.openTwiMaster(1, TwiMaster.Rate.RATE_1MHz, 
     // false); 
     // TWIA[1] = ioio_.openTwiMaster(2, TwiMaster.Rate.RATE_1MHz, 
     // false); 
     // TWIA[2] = ioio_.openTwiMaster(4, TwiMaster.Rate.RATE_1MHz, 
     // false); 
     // TWIA[3] = ioio_.openTwiMaster(5, TwiMaster.Rate.RATE_1MHz, 
     // false); 
     connStatus = true; 
    } 

    /** 
    * Called repetitively while the IOIO is connected. 
    * 
    * @throws ConnectionLostException 
    *    When IOIO connection is lost. 
    * @throws InterruptedException 
    * 
    * @see ioio.lib.util.AbstractIOIOActivity.IOIOThread#loop() 
    */ 
    @Override 
    public void loop() throws ConnectionLostException, InterruptedException { 
     led_.write(false); 

     DO1.write(currentDigFrag.digitalIO0Power.isChecked()); 
     DO2.write(currentDigFrag.digitalIO1Power.isChecked()); 
     DO3.write(currentDigFrag.digitalIO2Power.isChecked()); 
     DO4.write(currentDigFrag.digitalIO3Power.isChecked()); 
     DO5.write(currentDigFrag.digitalIO4Power.isChecked()); 
     DO6.write(currentDigFrag.digitalIO5Power.isChecked()); 
     DO7.write(currentDigFrag.digitalIO6Power.isChecked()); 
     DO8.write(currentDigFrag.digitalIO7Power.isChecked()); 
     DO9.write(currentDigFrag.digitalIO8Power.isChecked()); 
     DO10.write(currentDigFrag.digitalIO9Power.isChecked()); 
     DO11.write(currentDigFrag.digitalIO10Power.isChecked()); 
     DO12.write(currentDigFrag.digitalIO11Power.isChecked()); 

     UITask 
     currentDigFrag.updateDigitalInput(1, !DI1.read()); 
     currentDigFrag.updateDigitalInput(2, !DI2.read()); 
     currentDigFrag.updateDigitalInput(3, !DI3.read()); 
     currentDigFrag.updateDigitalInput(4, !DI4.read()); 
     currentDigFrag.updateDigitalInput(5, !DI5.read()); 
     currentDigFrag.updateDigitalInput(6, !DI6.read()); 
     currentDigFrag.updateDigitalInput(7, !DI7.read()); 
     currentDigFrag.updateDigitalInput(8, !DI8.read()); 
     currentDigFrag.updateDigitalInput(9, !DI8.read()); 

     currentAnFrag.updateAnalogInput(1,AI1.getVoltage()); 
     currentAnFrag.updateAnalogInput(2,AI2.getVoltage()); 
     currentAnFrag.updateAnalogInput(3,AI3.getVoltage()); 
     currentAnFrag.updateAnalogInput(4,AI4.getVoltage()); 
     currentAnFrag.updateAnalogInput(5,AI5.getVoltage()); 
     currentAnFrag.updateAnalogInput(6,AI6.getVoltage()); 
     currentAnFrag.updateAnalogInput(7,AI7.getVoltage()); 
     currentAnFrag.updateAnalogInput(8,AI8.getVoltage()); 
     currentAnFrag.updateAnalogInput(9,AI9.getVoltage()); 
     currentAnFrag.updateAnalogInput(10,AI10.getVoltage()); 
     currentAnFrag.updateAnalogInput(11,AI11.getVoltage()); 
     currentAnFrag.updateAnalogInput(12,AI12.getVoltage()); 
     currentAnFrag.updateAnalogInput(13,AI13.getVoltage()); 
     currentAnFrag.updateAnalogInput(14,AI14.getVoltage()); 
     currentAnFrag.updateAnalogInput(15,AI15.getVoltage()); 
     currentAnFrag.updateAnalogInput(16,AI16.getVoltage()); 
    } 
} 

그리고 내가 지금까지 AsyncTask로 구현 한 것입니다 : 여기

는 UI에 대한 루프 조금 혼란 스럽네요.

 private class UIAsyncTask extends AsyncTask<analogFragment, Float, Void> { 

     @Override 
protected Void doInBackground(analogFragment... params) { 
      //What do I do in here??? 
      return null; 
     } 

    } 

참고 : 두 클래스 모두 내부 클래스입니다.

참고 : currentDigFragcurrentAnFrag은보기가 포함 된 현재 Fragment입니다. 특히이 ProgressBar 전망

여기에 결과없이, 나는 무엇을 시도했다입니다 :

private class AnalogUpdater extends AsyncTask<AnalogInput, Void, Void> { 

    // A callback method executed on non UI thread, invoked after 
    // onPreExecute method if exists 

    // Takes a set of parameters of the type defined in your class 
    // implementation. This method will be 
    // executed on the background thread, so it must not attempt to interact 
    // with UI objects. 
    @Override 
    protected Void doInBackground(AnalogInput... params) { 
     try { 
      currentAnFrag.updateAnalogInput(1, AI1.getVoltage()); 
      currentAnFrag.updateAnalogInput(2, AI2.getVoltage()); 
      currentAnFrag.updateAnalogInput(3, AI3.getVoltage()); 
      currentAnFrag.updateAnalogInput(4, AI4.getVoltage()); 
      currentAnFrag.updateAnalogInput(5, AI5.getVoltage()); 
      currentAnFrag.updateAnalogInput(6, AI6.getVoltage()); 
      currentAnFrag.updateAnalogInput(7, AI7.getVoltage()); 
      currentAnFrag.updateAnalogInput(8, AI8.getVoltage()); 
      currentAnFrag.updateAnalogInput(9, AI9.getVoltage()); 
      currentAnFrag.updateAnalogInput(10, AI10.getVoltage()); 
      currentAnFrag.updateAnalogInput(11, AI11.getVoltage()); 
      currentAnFrag.updateAnalogInput(12, AI12.getVoltage()); 
      currentAnFrag.updateAnalogInput(13, AI13.getVoltage()); 
      currentAnFrag.updateAnalogInput(14, AI14.getVoltage()); 
      currentAnFrag.updateAnalogInput(15, AI15.getVoltage()); 
      currentAnFrag.updateAnalogInput(16, AI16.getVoltage()); 
     } catch (ConnectionLostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    // A callback method executed on UI thread, invoked by the 
    // publishProgress() 
    // from doInBackground() method 

    // Overrider this handler to post interim updates to the UI thread. This 
    // handler receives the set of parameters 
    // passed in publishProgress from within doInbackground. 
} 

}

+0

우리가 그것을 처리하기 위해 "어떻게"를 선택하기 전에의이 더 먼저 문제를 이해하자 읽을 수있다. 설치 메서드를 호출하게하는 트리거는 무엇입니까 (반복적입니까?)? 설치 호출 간에는 어떤 변화가 있습니까? 모든 UI 요소가 표시 되나요? 아니면 한 번에 일부만 표시됩니까? 표시 한 코드 집합이 호출되는 컨텍스트를 설명하십시오. – ErstwhileIII

+0

Loop() 만 반복적으로 호출됩니다. – Tukajo

+0

currentDigFrag 및 currentAnFrag의 모든 UI 요소가 항상 표시됩니다 (응용 프로그램이 UI를 제어하는 ​​조각이있는 다중 탭 활동입니다). – Tukajo

답변

1

그래서 여기에 당신이 AsyncTask를이 UI 스레드에 대한 액세스 권한을 가지고있는 기능을 인식해야한다. 가장 일반적으로 사용되는 것은 onProgressUpdate입니다.

이 함수를 호출하려면 publishProgress (Float ... progress) (하나의 Float 또는 Float의 배열을 지정)를 호출하고 onProgressUpdate() 함수에서 필요한 모든 UI를 업데이트해야합니다 수레의 배열.

doInBackground에서는 루프 논리를 여기에두고 필요로하는 변수를 저장하고 모든 루프의 끝 또는 다른 모든 루프를 저장하거나 설정된 시간 동안 루프를 일시 중지 한 후에도 앞에서 설명한 메서드에서 publishProgress를 호출합니다.

doInBackground()가 실행되기 전후에 추가로 설정하려는 경우에 대비하여 다른 방법으로 덮어 쓸 수 있습니다. 단, onPreExecute() 및 onPostExecute()가 있습니다.

http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html#concurrency_asynchtask은 좋은

+0

내 루프() 내에 비동기 작업을 넣을 수 있습니까? 죄송합니다. 안드로이드에 조금 익숙하지 않습니다. 조금 혼란 스럽습니다. – Tukajo

+0

아니요, doInBackground()의 while 또는 for 루프를 만든 다음 while/for 루프 내부의 모든 것을 loop()에 배치합니다. – Salvite

+0

그 문제는 루프가 IOIO-OTG의 연결에만 해당되며 시작되지 않는다는 것입니다. – Tukajo

관련 문제