2014-06-13 1 views
1

In App Purchasing (Async Tasks)을 방해하는 TimerTask에 문제가 있습니다. 스레드가 약해서 UI UI 스레드에서 실행 중이므로 리소스가 많이 소모됩니다. UI 스레드 외부에서 어떻게 실행합니까? 나는 수색을하고, 핸들러를 사용하여 몇 가지 제안을 시도했다. 하지만 같은 결과를 얻는 것처럼 보입니다. 앱이 실제로 느려집니다. 이 작업을 실행하지 않을 때 (500mS마다 새로 고침) 활동이 원활하게 실행되며 앱내 구매 중에는 응답이 없습니다. 당신의 도움이 감사합니다, 아래의 코드는 :Main UI 스레드에서 TimerTask를 실행하는 방법은 무엇입니까?

공용 클래스 DummyButtonClickerActivity는 활동 {

 protected Timer timeTicker = new Timer("Ticker"); 
     private Handler timerHandler = new Handler(); 
     protected int timeTickDown = 20; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mainhd); 

    // start money earned timer handler 
    TimerTask tick = new TimerTask() { 
     public void run() { 
      myTickTask(); 
     } 
    }; 

    timeTicker.scheduleAtFixedRate(tick, 0, 500); // 500 ms each 


} // End OnCreate 



protected void myTickTask() { 

    if (timeTickDown == 0) { 

     /// run my code here 
     //total = total + _Rate; 





     timerHandler.post(doUpdateTimeout); 
} 
     else if(timeTickDown < 0) { 
     // do nothing 
    } 

    timeTickDown--; 

} 

private Runnable doUpdateTimeout = new Runnable() { 
    public void run() { 

     updateTimeout(); 
    } 
}; 



private void updateTimeout() { 

    // reset tick 
    timeTickDown = 2; // 2* 500ms == once a second 



} 

}

+0

왜 30 초마다 실행해야합니까 ?? 디자인을 다시 생각해보십시오. – Rob

+0

코드를 그대로 들여 쓰는 것은 매우 어렵습니다. –

답변

0

당신은 별도의 스레드에서 핸들러를 실행합니다 HandlerThread를 사용할 수있는 확장

문서 :

Handy class for starting a new thread that has a looper. 
The looper can then be used to create handler classes. Note that start() must still be called. 

예 :

 HandlerThread mHandlerThread = new HandlerThread("my-handler"); 
    mHandlerThread.start(); 
    Handler mHandler = new Handler(mHandlerThread.getLooper()); 

갱신 :

private Runnable doUpdateTimeout; 
private HandlerThread mHandlerThread; 
private Handler timerHandler; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mainhd); 

    // start money earned timer handler 
    TimerTask tick = new TimerTask() { 
     public void run() { 
      myTickTask(); 
     } 
    }; 

    mHandlerThread = new HandlerThread("my-handler"); 
    mHandlerThread.start(); 

    timerHandler = new Handler(mHandlerThread.getLooper()); 
    doUpdateTimeout = new Runnable() { 
     public void run() { 

      updateTimeout(); 
     } 
    }; 

    timeTicker.scheduleAtFixedRate(tick, 0, 500); // 500 ms each 


} // End OnCreate 



protected void myTickTask() { 

    if (timeTickDown == 0) { 

     /// run my code here 
     //total = total + _Rate; 

     timerHandler.post(doUpdateTimeout); 
} 
     else if(timeTickDown < 0) { 
     // do nothing 
    } 

    timeTickDown--; 

} 





private void updateTimeout() { 

    // reset tick 
    timeTickDown = 2; // 2* 500ms == once a second 

} 
} 

서로 다른 스레드에서 텍스트 뷰

호출이 업데이트하려면 :

YOU_ACITIVITY_CLASS.this.runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      //update here 

     } 
    }); 
+0

정보 주셔서 감사합니다. 나는 아직도 여기에서 계속하는 방법을 모르겠다? – huskyd97

+0

내 코드를 어떻게 사용합니까? 이제 이러한 핸들러/handlerThread가 필요합니까? 죄송합니다. 매우 익숙합니다. 감사합니다. – huskyd97

+0

이 핸들러/스레드가 정의되고 시작되었으므로 죄송합니다. huskyd97 @ – huskyd97

0

핸들러가 실행 중이고 주 UI 스레드에서 처리 중이므로 doUpdateTimeout 메소드가 주 스레드에서 실행됩니다.

코드에서 10 초 후에 실행하면 timeTickDown이 0이고 코드 timerHandler.post(doUpdateTimeout);이 호출되어 주 스레드에서 실행됩니다. timeTickDown = 2;을 1 초 후에 보내기 때문에이 코드는 (메인 UI 스레드에서) 다시 실행되고 각 초에서 계속 실행됩니다. doUpdateTimeout 또는 updateTimeout에 다른 코드가있는 경우 주 스레드가 뒤떨어집니다.

timerHandler.post(doUpdateTimeout);에서 updateTimeout()으로 변경 (직접 호출 한 다음 주 UI 스레드가 아닌 Timer 스레드에서 실행).

+0

아직도 약간 혼란 스럽지만, 지금까지는이 코드를 가지고 있지만 반복하지는 않습니다. – huskyd97

+0

HandlerThread moneyEarnHandlerThread = new HandlerThread ("moneyearn-handler"); \t moneyEarnHandlerThread.start(); \t moneyearnedHandler = 새 처리기 (moneyEarnHandlerThread.getLooper()); \t moneyearnedHandler.post (새의 Runnable() { \t @Override \t 공공 무효 실행() { \t \t myTickTask(); \t \t \t} \t}); \t} // 끝 주요 – huskyd97

+0

보호 무효 myTickTask() { \t \t (timeTickDown == 0) { \t \t \t /// 여기에 내 코드를 실행하면 \t \t \t // 총 = 총 + _Rate; \t \t \t \t \t \t \t \t \t \t // timerHandler \t \t \t \t \t \t \t .게시물 (doUpdateTimeout); <- 귀하의 제안에 따라 주석 처리되었습니다. \t \t \t updateTimeout(); // <- 추가이 다른 } 경우 (timeTickDown <0) { \t \t \t // 아무것도를하지 않는다 \t \t} \t \t timeTickDown--; \t} \t 개인의 Runnable doUpdateTimeout = 새의 Runnable() { \t \t 공공 무효 실행() { \t \t \t updateTimeout(); \t \t} \t}}; \t 개인 무효 updateTimeout() { \t \t // 리셋 틱 \t \t timeTickDown = 2; 한 번 // 2 *은 500ms의 == 내가 타이머가 자신의 스레드를 가지고 있기 때문에, HandlerThread이 문제의 해결책이 사용 생각하지는 huskyd97 @ 두 번째 \t \t \t} – huskyd97

관련 문제