2014-07-15 3 views
2

센서에서 데이터를 수신하고 처리하는 Android 애플리케이션이 있습니다. 여기에는 하나의 기본 활동 클래스와 하나의 서비스 클래스가 포함됩니다. 서비스 클래스는 백그라운드에서 실행되어 센서에서 데이터를 수신하고 저장합니다. 액티비티 클래스에는 최대 100 일 전 일일 평균 값을 보여주는 기록 차트가 있습니다. 활동이 실행 중이 지 않을 때에도 서비스는 백그라운드에서 데이터를 계속 수신해야하기 때문에 활동과 서비스의 수명주기는 독립적이어야합니다.액티비티와 서비스간에 동적 배열 목록 공유

여기 현재 구현됩니다. 액티비티가 서비스의 데이터에 액세스 할 수 있도록 공유 환경 설정을 사용합니다. 새로운 데이터가 도착할 때마다 서비스는 데이터를 arrayList에 저장 한 다음 arrayList를 json으로 serialize하고 json을 공유 환경 설정에 저장합니다. 이것은 새로운 데이터를 저장하고 싶을 때마다 json 배열 전체를 기본 설정에서 가져 와서 deserialize하고 데이터를 추가 한 다음 json 배열을 다시 가져와야하기 때문에 그리 효율적이지 않습니다. 역 직렬화를하지 않고 json 배열 문자열에 새로운 json 객체를 추가하는 방법이있을 수도 있지만 어떻게 계산하지 못했는지 알고 있습니다. 그러나 이것이 가능하더라도 여전히 json 배열 전체가 여전히 기본 설정에서 검색되어야하고이 로컬 객체에 메모리를 할당해야하기 때문에 여전히 효율적이지 않다고 생각합니다. 또한 그래프를 업데이트 할 때 전체 json을 deserialize해야합니다.

그래서 배열 필드를 서비스 필드로 유지하고 기본 활동이이 필드에 직접 액세스하게하는 방법이 있는지 생각하고 있습니다. 나는 많은 검색을했지만 좋은 해결책을 찾지 못했습니다. 이것은 바보 같은 질문이 들리 겠지만 필자는 안드로이드를 처음 접했을 때 도움이된다. 또한 어떤 구현이 선호되는지 궁금하다. 더 좋은 해결책이 있다면? 모든 도움에 감사드립니다.

답변

0

더 좋은 방법은 sqlite와 브로드 캐스트 리시버의 조합을 사용하는 것입니다. 새 데이터가 도착할 때마다 sqlite db에 저장하고 브로드 캐스트를 시작합니다. 새로운 센서 값이 검색 될 때마다

사용자 정의 방송을 발사 :

Intent newSensorValues = new Intent("NEW_SENSOR_VALUE"); 
//Add the new sensor values as extras to the intent. 
newSensorValues.putExtra.. 
... 
sendBroadcast(newSensorValues); 
//You'll also want to save the data to the sqlite database here. 
saveToDb(); 

이 왜 방송 화재 - 활동이 화면에 때마다 서비스에서 작업을 업데이트하려면.

그래프를 표시하려는 활동에서 BroadcastReceiver을 "NEW_SENSOR_VALUE"유형으로 등록하십시오. 따라서 새로운 브로드 캐스트를 수신 할 때마다 의도를 전달한 데이터를 사용하여지도를 업데이트하면됩니다. onPause() 수신자의 등록을 취소하여 활동이 일시 중지되었을 때지도가 업데이트되지 않도록합니다. 활동의 onCreate() 내부

//Inside onResume() : 
this.registerReceiver(newSensorValueReceiver, new IntentFilter(
        "NEW_SENSOR_VALUE")); 

//Inside onPause() : 
this.unregisterReceiver(newSensorValueReceiver); 

//Broadcast Receiver Class. 
private BroadcastReceiver newSensorValueReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     intent.getExtra... 
     updateGraph(); 
    } 
}; 

:

fetchValueFromDb(); 
updateGraph(); 

이 방법에 대한 좋은 점 :

당신은 활동이 열릴 경우에만 데이터베이스에서 데이터를 액세스 할 필요가
  1. . 나머지 시간에는 새 센서 값이 수신 될 때마다 sqlite db에 저장합니다.
  2. 그래프는 항상 실시간으로 업데이트됩니다.
+0

감사합니다 @ Shivam Verma, 당신의 대답은 매우 도움이됩니다! 당신이 말했듯이 방송 수신기를 사용하여 최신 독서를 업데이트했습니다. 그러나 방송 수신기가 일시 중지되면 등록이 취소 된 경우 onCreate() 대신 onResume()에 fetchValueFromDb()를 넣어야합니까? 따라서 앱이 백그라운드에있을 때 새로운 데이터가 도착하면 앱이 포 그라운드로 다시 갈 때 그래프에 즉시 반영 될 수 있습니다. – wwan

+0

아 예! 그게 더 좋을거야. 당신은 아이디어가 있어요 :) –

+0

실제로 내가 방금 실행 한 또 다른 문제는 어떻게 활동과 서비스 사이에 sqlite 데이터베이스를 공유해야합니까? sqliteopenhelper singleton 만들기, 어디에서나 액세스 할 수있는 도우미 인스턴스를 시작하기 위해 Application 클래스 확장 또는 같은 응용 프로그램 컨텍스트로 별도의 도우미 인스턴스 만들기와 같은 여러 솔루션에 대해 사람들이 이야기하는 것을 보았습니다. 어떤 솔루션이 가장 잘 작동하는지 궁금합니다. – wwan

0

왜 sqlite3을 사용하여 데이터를 저장하지 않으셨습니까? 새 데이터가 도착하면 sqlite3에 저장할 수 있습니다. 액티비티를 액티비티에 표시하려면 데이터베이스에서 읽거나 표시 할 레코드를 선택해야합니다.

+0

@Field를 생각하는 사람.wei는 정확한 대답을하지 않고 투표를하면 설명을 제공해야합니다. 그리고 OP는 또 다른 가능한 구현을 요구하고 있습니다. 나는 json을 사용하여 OP가 원하는 것을 틀리게하고 sqlite를 사용하는 것이 대답이되어야한다고 생각한다. 무엇이 잘못 되었는가? (나는 그것을 upvoted) – DayDayHappy

+0

감사합니다 @ Field.wei! 이것은 json보다 확실히 좋은 구현입니다. – wwan

관련 문제