2012-12-11 2 views
2

HTML 웹 페이지에서 일부 데이터를 가져와 매초마다 표시하는 앱을 개발하려고합니다. i가 이러한 방식으로 구동 가능한 사용하고 그 내용Android Runnable 내 기기 속도 저하

:하지 OnCreate

() 메소드

mHandler.removeCallbacks(mMuestraMensaje); 
mHandler.postDelayed(mMuestraMensaje, 5000); 

그리고,이 다른 방법

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

      try { 
      returned = test.GetSensorData(newString); 
      rowTextView.setText(returned); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
      mHandler.removeCallbacks(mMuestraMensaje); 
      mHandler.postDelayed(this, 500); 
     } 
     }; 

이 문제 예를 들어 뒤로 버튼을 누르면 앱이 천천히 작동하기 시작하고 앱을 닫을 때까지 기기가 너무 느리게 실행됩니다.

감사합니다.

편집

이 전체 클래스 :

public class HttpExample extends Title { 




GetMethodEx test, moredata ; 
String returned; 
TextView rowTextView, rowTextView2; 
LinearLayout ll; 
private Handler mHandler = new Handler(); 
String newString; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.httpexample); 
    rowTextView = (TextView)findViewById(R.id.textView2); 
    rowTextView2 = (TextView)findViewById(R.id.textView1); 

    mHandler.removeCallbacks(mMuestraMensaje); 
    mHandler.postDelayed(mMuestraMensaje, 5000); 


    Bundle extras = getIntent().getExtras(); 
    newString = extras.getString("STRING_I_NEED"); 


    test = new GetMethodEx(); 
    moredata = new GetMethodEx(); 

    try { 
     String name = moredata.GetName(newString); 
     rowTextView2.setText(name); 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    ScheduledExecutorService executor = 
      Executors.newSingleThreadScheduledExecutor(); 

     executor.scheduleAtFixedRate(mMuestraMensaje , 0, 500, TimeUnit.MILLISECONDS); 

} 




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

      try { 
       returned = test.GetSensorData(newString); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      MainActivity.this.runOnUiThread(new Runnable(){ 
       rowTextView.setText(returned); 
      }); 
     } 
     }; 

}

+0

이'mHandler' 별도의 (비 UI) 스레드에 연결되어 : – waqaslam

+0

아니에요. 내가 어떻게 할 수 있니? – Aldridge1991

답변

1

당신이 GUI 스레드에서 스레드를 실행하기 때문에 프로그램이 속도가 느려집니다. 추천하지 않습니다. 그러나, 나는 당신이 끝난 후에 당신이 텍스트를 설정하고 있음을 발견했다. 다음은 할 수있는 몇 가지 사항입니다.

  1. 센서 데이터 수집을 다른 스레드에서 실행하십시오. runOnUiThread 명령으로 텍스트를 업데이트하십시오.
  2. AsyncTask을 사용하십시오. 이것은 이상적인 상황 인 것 같습니다.
  3. UI 스레드를 필요로하지 않는 일반적인 경우에는 ScheduledExecutorService을 사용하는 것이 좋습니다.

가장 간단한 방법은 첫 번째 방법 일 것이지만 두 번째 방법은주의 깊게 살펴볼 것입니다. (당신이 당신의 활동의 이름으로 MainActivity를 교체해야합니다, 참고)

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 

executor.scheduleAtFixedRate(mMuestraMensaje , 0, 500, TimeUnit.MILLISECONDS); 

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

     try { 
      returned = test.GetSensorData(newString); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     MainActivity.this.runOnUiThread(new Runnable(){ 
      rowTextView.setText(returned); 
     }); 
    } 
    }; 
+0

Implementig 내가이 오류를 얻을이 코드 : \t이 이 라인에서 여러 개의 마커를 - 토큰 (들), 잘못된 구조 (들) \t에 구문 오류 - 토큰 "반환"에 구문 오류가 VariableDeclaratorId 전체 코드를 편집 – Aldridge1991

+0

후 예상 클래스의 – Aldridge1991

+0

어느 두 라인? 나는 당신이 의미하는 바를 얻을 수 없다 :( – Aldridge1991

0

당신은 HandlerThread를 사용하여 당신이 Handler 다른 스레드에서 작업을 첨부 할 수 있습니다 : 첫 번째 옵션은 다음과 같이 될 것이다. 예를 들어 :

HandlerThread ht = new HandlerThread("nonUiThread"); 
ht.start(); 
Handler mHandler = new Handler(ht.getLooper()); 

하지만, 더 바람직하게는, 나는 당신이 귀하의 경우 AsyncTask를 사용하는 것이 좋습니다 것입니다.

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

     try { 
       returned = test.GetSensorData(newString); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     HttpExample.this.runOnUiThread(new Runnable(){ 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       rowTextView.setText(returned.get(0)+returned.get(1)); 
       rowTextView2.setText(returned.get(2)); 


      } 

     }); 

    } 

    }; 
+0

해답을 가져 주셔서 감사합니다. 하지만 AsyncTask를 사용하는 것 외에는 실행 파일이 필요합니다. 그렇습니까? – Aldridge1991

+0

Runnable을 사용하는 경우 AsyncTask의 doInBackground 메소드로 대체해야하기 때문에 도랑을 파낼 수 있습니다. – waqaslam