2013-12-09 2 views
6

내가 가진 2 개 클래스,업데이트 목록보기

1.Activity 클래스

내 활동에 내 목록보기를 업데이트해야

2.Service 클래스, 서비스가 왔을 때 모든 업데이트. 사실 나는 채팅 응용 프로그램처럼 노력하고 있습니다. 내 서비스는 항상 내 DB를 검사하고 새로운 문자열이 있으면 다시 작성하지 않고 내 활동을 업데이트해야합니다. 목록보기를 새로 고침해야합니다. 나는 그것이 iBinder를 사용하여 조작된다는 것을 알았지 만 그것을 사용하는 방법을 모르겠습니다. 어떤 사람이 코드의 몇 가지 예를 나에게 제안 할 수 있습니까?

referred pages

답변

4

당신은 바운드 서비스를 사용해야합니다. 나는 나의 응용에서 비슷한 것을했다. 새로 고침을 클릭하면 백그라운드에서 데이터를 가져와 UI를 업데이트하는 서비스를 호출합니다.

여기에 체크 아웃 내 서비스 : https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/AnalyticsDataService.java

@Override 
protected void onPostExecute(AnalyticsAccountResult result) { 
    super.onPostExecute(result); 
    App.getEventBus().post(result); 
} 

활동 : https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/MainActivity.java

@Subscribe 
public void UpdateUI(AnalyticsAccountResult result) { 
    ProgressBar progressbar = (ProgressBar) findViewById(R.id.pbHeaderProgress); 
    LinearLayout spinnerLayout = (LinearLayout) findViewById(R.id.spinnerslayout); 
    TextView statusMessage = (TextView) findViewById(R.id.statusMessage); 

    switch (result.getStatus()) { 
     case STARTING: 
     statusMessage.setVisibility(View.GONE); 
     progressbar.setVisibility(View.VISIBLE); 
     spinnerLayout.setVisibility(View.GONE); 
     break; 

     case FAILURE: 
     statusMessage.setVisibility(View.VISIBLE); 
     progressbar.setVisibility(View.GONE); 
     spinnerLayout.setVisibility(View.GONE); 
     statusMessage.setText(result.getErrorMessage()); 
     break; 

     case SUCCESS: 
     statusMessage.setVisibility(View.GONE); 
     progressbar.setVisibility(View.GONE); 
     spinnerLayout.setVisibility(View.VISIBLE); 

     if (result.getItems() != null) 
     { 
      this.acProfiles = result.getItems(); 
      MyAdapter myAdapter = new MyAdapter(acProfiles, this); 
      listView.setAdapter(myAdapter); 
      UpdateSelectionPreferences(); 
      if (result.isPersist() && acProfiles.size() > 0) 
      { 
       if (App.LOCAL_LOGV) 
       Log.v(App.TAG, "saving configdata");   
       try 
       { 
        appPreferences.saveConfigData(acProfiles, credential.getSelectedAccountName()); 
       } 
       catch (JsonProcessingException e) 
       { 
        Log.e(App.TAG, e.getMessage()); 
       } 
      } 
     } 
     break; 
    } 
} 

또한 도움이 오토 라이브러리를 사용하는 것입니다 자세한 정보가 없으면
http://square.github.io/otto/

0

를 I 양철통 유용한 코드 예제를 제공하지는 않겠지 만, 당신이 찾고있는 것이 ListAdapter라고 생각합니다. ListAdapter는 listview와 데이터 집합 (문자열의 배열 일 수도 있음)을 취해서 결합합니다. 2. 데이터 집합이 변경 될 때마다 (이 경우 서비스에서 새 문자열을 감지하여 배열에 추가 할 때마다) ListAdapter.notifyDataSetChanged()를 호출하면 listview가 새 정보로 자동 업데이트됩니다. 사용할 수있는 특정 ListAdapter에 대한 자세한 내용은 http://developer.android.com/reference/android/widget/ArrayAdapter.html을 확인하십시오.

+1

고맙습니다 답장을 보내 .. : 당신이 당신의 서비스 클래스 내부에 목록보기 데이터를 변경 한 경우,

public static Handler UIHandler; static { UIHandler = new Handler(Looper.getMainLooper()); } public static void runOnUI(Runnable runnable) { UIHandler.post(runnable); } 

ListView에 새 데이터를 적용하려면이 코드를 작성 : MainActivity 내부에이 코드를 넣어 사실 당신은 옳습니다.하지만 제 질문은 제 활동에서 그 데이터 집합이 어떻게 변경되었는지를 어떻게 알 수 있습니까? 내 봉사에서 어떻게 받아 들여야합니까? – GaneshKumar

+0

나는이 방법을 개인적으로 할 필요가 없기 때문에 어느 방법이 가장 좋은지 말할 수는 없지만 [BroadcastReceiver] (http://developer.android.com/reference/android/content/BroadcastReceiver.html)는 당신을 위해 일합니다. 이것은 서비스에 의해 브로드 캐스트 된 메시지를 처리 ​​할 수있는 추상 클래스입니다. 서비스는 새로운 문자열을 발견하면 sendBroadcast() 메소드를 사용하며, 활동이 BroadcastReciever로 등록되어 브로드 캐스트가 수신 될 때 어떤 조치를 수행합니다. – csmckelvey

3

listviewAdapter라는 어댑터로 ListView를 초기화 한 MainActivity라는 활동 클래스가 있다고 가정 해 보겠습니다. ,

MainActivity.runOnUI(new Runnable() 
{ 
    public void run() 
    { 
     try 
     { 
      MainActivity.listviewAdapter.notifyDataSetChanged(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
}); 
+0

이것은 좋은 일이지만 지금은 작업하고 있지만 다음과 같은 스레드 관련 예외를 두려워합니다. / – Reda