2014-07-04 4 views
4

는 사실은 데이터 스토리지 안드로이드 응용 프로그램을 핵 물질 해요, 나는 다음과 같이 진행 :안드로이드 데이터 저장 성능

활동 -> 비즈니스 서비스 -> 리포을 (봄 REST의 FW로). 이것을 사용하여 활동을 마치기 전에 저장 작업을 끝내도록 강요했습니다 (스레드 처리, 진행 대화 ...).

안드로이드 서비스를 사용하여 데이터를 저장하는 것은 나쁜 코딩 방법입니까?

사용자는 계속해서 탐색 할 수 있으며 매우 유동적 인 응용 프로그램으로 작업 할 수 있습니다. 이것은 좋은 해결책입니까?

감사

답변

27

배경 논리가 완료 될 때까지 기다리는 전경에서 활동을 계속 할 필요가 없습니다.

대신해야 할 일은이 백그라운드 논리를 활동에서 분리 된 방식으로 실행하는 것입니다.

이 문제를 해결하는 방법은 위험하고 안전합니다.


당신은 AsyncTask를 사용할 수 있습니다 또는 java.concurrent의 대신 스레드의 구축

class MyActivity extends Activity { 

    void calledWhenActivityNeedsToBeClosed() { 

      // start a thread to do background work 
      new Thread() { 
       public void run() { 
        perform long running logic here 
       } 
      }.start(); 

      // and clos the activity without waiting for the thread to complete 
      this.finish(); 
    } 
} 

위험한 방법. 그들은 모두 일을 할 것입니다.

나는 수년간 이런 식으로 사용해 왔습니다. 대부분 잘 작동합니다. 하지만 ... 본질적으로 결함이 있습니다.
왜? 활동이 완료되면 Android는 모든 리소스와 함께 언제든지이를 회수하고 모든 작업자 스레드를 중지 할 수 있습니다.
장시간의 작업 시간이 몇 초를 초과하지 않으며 리포 업데이트가 있다고 가정 할 경우 여기위험은 최소화됩니다. 그러나 왜 그것을 가져 가야합니까?


안전한 방법

서비스를 선언하고 활동이 아래로 가기 전에는 장기 실행 작업을 수행하기 위해 활성화 :

class MyActivity extends Activity { 

    void calledWhenActivityNeedsToBeClosed() { 

      // delegate long running work to service 
      startService(this, new Intent(this, MyWorkerService.class)); 

      // and close the activity without waiting for the thread to complete 
      this.finish(); 
    } 

} 


이를 나는 s 많이 안전합니다. 안드로이드는 실행중인 서비스를 죽일 수 있으며 때로는 실행중인 서비스도 죽일 수 있지만 배경 활동을 죽이는 것보다 훨씬 마지 못해합니다. 당신은 작업자 서비스가 계속 실행되는 동안 UI가 볼 수있는 시나리오, 을 볼 수 있다면 당신은 아마 대신 IntentService을 사용할 것이라고


참고.


마지막으로 - 당신이 절대적으로 그 배경 논리가 안드로이드에 의해 삭제되지 않습니다 확신 할하려는 경우, 당신은 foreground service를 사용해야합니다. 다음은 그것을 할 수 있지만, 경고하십시오 방법 - 당신은 설명했다 같은 경우에, 전경 서비스는 엔지니어링을 통해 아마 : 당신의 대답에 대한

static final int NOTIF_ID = 100; 

// Create the FG service intent 
Intent intent = new Intent(getApplicationContext(), MyActivity.class); // set notification activity 
showTaskIntent.setAction(Intent.ACTION_MAIN); 
showTaskIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
showTaskIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

PendingIntent pIntent = PendingIntent.getActivity(
       getApplicationContext(), 
       0, 
       intent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 

Notification notif = new Notification.Builder(getApplicationContext()) 
       .setContentTitle(getString(R.string.app_name)) 
       .setContentText(contentText) 
       .setSmallIcon(R.drawable.ic_notification) 
       .setContentIntent(pIntent) 
       .build(); 

startForeground(NOTIF_ID, notif); 


+0

감사합니다. 그리고 매번 백그라운드에서 전환하는 서비스는 무엇입니까? 그의 목표는 네트워크 연결을 얻을 때 저장되지 않은 데이터를 저장하는 것입니다. 네트워크 연결이 있어도 데이터를 저장하는 것은 나쁜 방법입니까? 필요시 활동에 서비스 바인딩? – mfrachet

관련 문제