2012-11-04 2 views
0

원격 서버와 통신하는 백그라운드 서비스를 실행하는 애플리케이션을 작성 중입니다. 서버에서 나에게 새 메시지를 보내면 UI에 표시된 객체를 업데이트 한 다음 UI보기를 업데이트하여 객체의 새 상태를 나타내야합니다 (예 : 객체의 배경색이 참인 경우 - 녹색으로보기의 배경 및 허위로보기의 배경을 빨간색으로 설정).Android 서비스 communcation

나는 ArrayAdapter를 던지는 모든 객체의 ArrayList를 모두 표시하는 목록보기를 사용하고 있습니다.

정적 참조 용 Application 개체가 있고 현재 실행중인 활동을 저장하는 CurrentActivity 속성이 있습니다 (UI가 닫혀 있으면 null). 내 서비스에서

: 내 활동에

onNewMessage(boolean backgruond) 
{ 
    if (app.getCurrentActivity != null) 
    app.getCurrentActivity.onNewMessage(background); 
} 

:

난은 UI 업데이트하려면이 코드를 사용하고

onNewMessage(boolean background) 
{ 
    object.setBackground(bacground); 
    Log.d("Background", String.valueof(background)); 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() 
     { 
     arrayAdapter.notifyDataSetChanged(); 
     } 
    }); 
} 

및 로그 오른쪽 배경 상태를 반환하지만, ,보기가 notifyDataSetChanged()로 새로 고침되지 않습니다.

나는 Activity DiscastRecevier에 메시지를 보내려고했지만 서버에서 오는 많은 메시지가 있고 많은 수신기를 등록해야하기 때문에 훨씬 더 복잡합니다. 게다가 - 내가 이해하지 못하는 이유는 것 ListView에 업데이트하는 recevier 작업과 습관이 메커니즘 .. 작업 방법의

예 :

ListViewActivity - BaseActivity에서 상속 :

@Override 
public void onUnFriend(FacebookUser facebookUser, boolean isYouRemovedClient) 
{    
    super.onUnFriend(facebookUser, isYouRemovedClient); 
    updateView(); 
} 

을 BaseActivity (Activity를 확장하는 수퍼 클래스) :

public void onUnFriend(FacebookUser facebookUser, boolean isYouRemovedClient) 
{       
    facebookUser.setApplicationFriend(false); 
    app.getApplicationFriends().remove(facebookUser); 
    app.getDatabaseManager().deleteApplicationFriend(facebookUser.getId());  
    if (isYouRemovedClient) 
     app.showToast(facebookUser.getName() + " has removed from your friends", true); 
    else 
     app.showToast(facebookUser.getName() + " has removed you from friends", true); 
} 

이 하나가 작동하여 배경이 변경됩니다. 색상을 ListView.

예를 ListViewActivity를 작동하지 :

@Override 
public void onFriendRequestAccepted(FacebookUser facebookUser, boolean showDialog) { 
    super.onFriendRequestAccepted(facebookUser, showDialog); 
    updateView(); 
} 

BaseActivity : 어떤 업데이트가 이루어지지 않습니다

public void onFriendRequestAccepted(FacebookUser facebookUser, boolean showDialog) 
{ 
    facebookUser.setApplicationFriend(true); 
    app.getApplicationFriends().add(facebookUser); 
    app.getDatabaseManager().addApplicationFriend(facebookUser); 
    if (showDialog) 
     app.showNewEventActivity(facebookUser, EventDialogManager.EVENT_FRIEND_ACCEPTED); 
} 

... 난 정말 이유를 이해할 수 없다 ..

답변

0

내가 가지고 현재 실행중인 액티비티를 저장하는 CurrentActivity 속성 (UI가 닫힌 경우 null)

이 방법은 권장하지 않습니다. 해당 Application 데이터 멤버를 지속적이고 안정적으로 업데이트하므로 서비스와 UI 간의 결합이 증가합니다.

로그가 올바른 배경 상태를 반환하지만보기가 notifyDataSetChanged()로 새로 고침되지 않습니다.

어댑터의 데이터를 변경하지 않은 것으로 보입니다. 물론 코드에서 어댑터의 데이터를 업데이트했다는 증거는 없습니다.

여기에 표시된 코드 스 니펫 중 어느 것도 컴파일 할 가능성이 없습니다 (첫 번째 코드는 유효하지 않습니다. 두 번째 코드는 오타가 있습니다).

내가 서버에서 오는 메시지를 많이 가지고 있고 많은 수신기

번호를 등록해야합니다, 당신은 하나 개의 수신기를 등록해야하며, onReceive()에서, if 문을 사용 (혹은 a switch, 원하는 경우) 한 메시지를 다른 메시지와 구분할 수 있습니다.

+0

내가 보여준 코드 스 니펫은 질문에 대해 작성한 예제입니다. 어댑터의 데이터를 변경 했으므로 속성을 변경했습니다.이 객체는 arraylist 내부에 있습니다. adpater –

+0

나는 그들이 쓸모 없다는 것을 의미하지는 않았다. 그들은 내 문제를 보여 주기로되어있다. ... –

+0

하지만 객체 속성이 변경된 경우 notifyOnDataSetChanged가 뷰를 업데이트해야 하는가? –

0

CommonsWare가 말한 것 이외에도, onNewMessage의 첫 번째 줄에 object이 있다고 가정합니다. setBackroundboolean이 아니라 int 매개 변수를 허용합니다.

녹색은 0xFF00FF00이고 빨간색은 0xFFFF0000입니다. 그런데

, 그것은 Context 객체의 정적 참조를 유지하는 아주 나쁜 관행 그리고 그것은 모두 Context에서 파생, 심각한 메모리 누수로 이어질 수 그들의 정적 참조를 유지 ( ApplicationActivity를 파생 클래스입니다. 읽기 here 더)

대신 BroadcastReceiver을 사용하십시오. 당신이 설명했던 것과 비교하면 훨씬 간단합니다. 당신은 단지 하나만 필요합니다.

+0

그것은보기가 아닙니다. 단지 객체의 예일뿐입니다. 제 질문에 ListView가 그 속성으로 어떻게 작동해야 하는지를 설명했습니다. –

+0

CommonsWare가 추측 한 것처럼 객체 목록을 변경하지 않았기 때문에'notifyDataSetChanged'는 아무 것도하지 않습니다. 목록의 단일 개체 변경은 계산하지 않으며 목록 자체 만 변경합니다. 읽기 : http://stackoverflow.com/questions/3669325/notifydatasetchanged-example/5092426#5092426 – Jong

+0

일부 기능을 변경하려면 어떻게해야합니까? –