2014-08-31 6 views
1

삼성 전자에서 사용 가능한 RAM을 확인하는 앱을 만들었습니다. 값을 2 초마다 업데이트하고 싶습니다.메시지를 다시 mainthread로 보냅니다.

백그라운드 스레드에 넣고 계산 된 값을 주 스레드로 보내는 방법을 모르겠습니다. 나는 핸들러 클래스가 필요하다 생각하지만

private TextView tv; 
private Handler handler; 
private long availableMegs; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    tv = (TextView) findViewById(R.id.meminfo_view); 
    tv.setText("TILLGÄNGLIGT RAM = " + availableMegs); 

    Thread t = new Thread(new Runnable() { 

     @Override 
     public void run() { 

      while (true) { 

       MemoryInfo mi = new MemoryInfo(); 
       ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
       activityManager.getMemoryInfo(mi); 
       long availableMegs = mi.availMem/1048576L; 

       tv.setText("TILLGÄNGLIGT RAM = " + availableMegs); 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException ie) { 
        //... 
       } 
      } 
     } 

    }); 

    t.start(); 

} 

답변

0

에게 쉬운 방법을 구현하는 것입니다 UI 스레드와 동기화하는 방법을 모르겠어요 내가 제안이 경우

tv.post(new Runnable() { 
     @Override 
     public void run() { 
      tv.setText("TILLGÄNGLIGT RAM = " + availableMegs); 
     } 
}); 
+0

감사합니다. 그러나 내가 얻는 것은 모두 빈 화면입니다. – bjha

0

Listener 기반 접근 방식을 사용합니다. 을 처리하기 위해 필요한 코드를

public static class MemoryThread extends Thread{ 

    private OnMemoryListener listener; 

    public MemoryThread(OnMemoryListener l){ 
     super(); 
     listener = l; 
    } 

    @Override 
    public void run() { 

     // execute memory code 

     if(listener != null) 
      listener.onMemoryReceived(value); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException ie) { 
      //... 
     }   
     super.run(); 
    } 

} 

활동이 OnMemoryListener을 구현 확인하고 제공 :

public interface OnMemoryListener{ 

    public void onMemoryReceived(String value); 
} 

깨끗한 코드를 유지하기 위해 Thread을 연장하는 별도의 클래스를 만들기 : 당신은 인터페이스를 만들 수 있습니다 결과. 주 스레드에서 리스너의 코드를 실행하려면 activitiy의 runOnUiThread() 메소드를 사용할 수 있습니다.

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    MemoryThread mt = new MemoryThread(this); 
    mt.start(); 
} 

@Override 
public void onMemoryReceived(final String value){ 

     runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       // handle the result here 

      } 
     }); 
} 
관련 문제