안드로이드에서 장기 (시간이 많이 걸리는) 작업을 정리하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2241049

  •  19-09-2019
  •  | 
  •  

문제

예를 들어, 우리는 SomeActivity에 있으며 활동에는 한 딥에서 다른 DIR로 이동 파일을 호출하는 버튼이 있습니다 (작업이라고 부릅니다).

Blackberry에서 나는 다음과 같습니다.

  1. "잠깐만 기다려주세요 ..."
  2. 작업을 수행하는 스레드를 시작하십시오
  3. 스레드 완료시 팝업을 닫습니다

이 접근법 99.99%는 작업이 끝난 후 동일한 화면에 머무르도록 보장 할 수 있으며 사용자는 팝업을보고 작업 완료를 기다립니다. 장치 회전 또는 원하는 워크 플로를 깨뜨리지 않는 것.

안드로이드에서 상황이 바뀝니다. 나는 아마도 내 사건을 해결하기 위해 제공되는 Asynctask가 있다는 것을 알고 있습니다. 좋은 것도 있습니다 예시 그것이 어떻게 사용되어야하는지에 대해. 그러나 활동 인스턴스가 얼마나 오래 거주 할 것인지에 대한 보장은 없기 때문에 onsaveinstancestate에서 Asynctask를 취소해야합니다 (OnRestoreInstancestate에서 다시 시작). 이것은 Asynctask를 사용하는 것을 의미합니다. 일단 시작되면 작업을 완전히 이행 할 수 있다는 보장은 없습니다. 경우에 따라 HTTP 사후 요청을 보내는 경우에도 "이 로그인에 대한 사용자가 이미 존재합니다"문제가 발생합니다. 요청이 이미 전송되는 동안 Asynctask를 중단 할 수 있기 때문에 가능합니다 (서버가 실제로 작업을 수행하고 있습니다 - 새 사용자를 생성). 그러나 응답을 받기 전에 Asynctask가 취소됩니다.

안드로이드에 위에서 언급 한 BB와 같은 동작을 얻을 수있는 솔루션이 있습니까?

도움이 되었습니까?

해결책 3

2010 년 5 월 Google은 새로운 IO 세션을 발행했습니다. Android REST 클라이언트 응용 프로그램 개발 내가 요청한 것을 정확하게 달성하는 방법을 설명합니다.

질문이 다소 복잡하다는 것이 밝혀 졌기 때문에 쉽고 빠른 해결책이 없습니다. 이 솔루션은 Android 플랫폼/API에 대한 깊은 지식이 필요합니다. 이것은 앱 프로세스/활동 라이프 사이클의 유연성으로 인한 가격입니다.

이 정보가 Android의 첫 번째 버전에서 제시되지 않은 이유에 대해 약간의 이상하다고 생각합니다. Google은 100% 버그가없는 앱을 작성하는 방법을 알고있는 것처럼 보이며 마케팅 이유는 접근 방식을 공유하지 않았습니다. 2010 년 5 월까지 몇 개의 버기 앱이 작성되었는지 상상해보십시오.

어쨌든 나는 지금 우리가 모범 사례 접근법이라고 부르는 SMTH를 가지고 있다는 것이 기쁩니다.

다른 팁

그러나 활동 인스턴스가 얼마나 오래 거주 할 것인지에 대한 보장은 없기 때문에 onsaveinstancestate에서 Asynctask를 취소해야합니다 (OnRestoreInstancestate에서 다시 시작).

또는 a Service.

활동이 화면에 머무르고 싶다면 다음과 같은 스레드를 시작할 수 있습니다.

final File fromFile = ...;
final File toFile = ...;

new Thread() {
    @Override
    public void run() {
      // do something with fromFile, toFile
    }
}.start();

그렇게하면 Gui Shread가 다른 생각을 할 준비가되어 있습니다.

  android.app.ProgressDialog

또한 대화 상자를 해체 할 수없는 것을 고려하십시오

  ProgressDialog.setCancelable(false);

그렇게하면 사용자는 홈 키를 통해서만 떠날 수 있습니다.

  Activity.onPause()

호출됩니다. FUNTHERMORE 화면이 검은 색으로 바뀌지 않도록 wakelocks를보고 싶을 수도 있습니다. 당신은 스레드에서 이것을 할 것입니다 :

  PowerManager pm = (PowerManager) ivContext.getSystemService(Context.POWER_SERVICE);
  Wakelock wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "MyApp");
  wakeLock.acquire();

  // ... copy stuff ...

  wakeLock.release();

물론 사용자가 홈 키를 통해 떠날 때와 켈락도 풀어야합니다.

마지막으로 배경 스레드에서 gui 요소를 호출하려면 스레드가 Gui-Event-loop의 일부인 경우에만 작동합니다. 일반 스레드가 실행되는 것처럼 ... -행동 양식. 이를 달성하려면 배경 스레드는 핸들러를 통해 Gui-Shread로 콜백해야합니다. 이와 같이:

  private Handler mHandler = new Handler() { 
      @Override
      public void handleMessage(Message msg) {
          Log.v(TAG, "Got Message "+msg.what); // prints: Got Message 77
      // ... do GUI actions ...
      }    
  };

  // ... in Thread ...

  int lvInfo = 77;
  mHandler.sendEmptyMessage(lvInfo);

당신은 다음과 같은 메시지에 객체를 넣을 수도 있습니다.

  Message txtMsg = Message.obtain();
  textMsg.obj = "Hello World";
  mHandler.sendMessage(lvTextMsg);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top