2014-02-13 3 views
2

안드로이드 폰의 파일 시스템을 검색하는 앱을 만들었으며 현재 파일이 검색되는 정보로 알림 바에서 알림을 업데이트하고 싶습니다.AsyncTask 대신 AsyncTask를 사용하여 장기 실행 작업을위한 UI 업데이트

처음에는 AsyncTask를 사용하고 싶었지만 믿을 수있는 파일 시스템을 검색하는 장기 실행 작업에는 사용하면 안된다는 것을 발견했습니다. 워드 프로세서

AsyncTasks 이상적으로 그들의 조언 집행자, 가능한 ThreadPoolExecutor와 FutureTask를 사용하는 것입니다 가장.

에서 (짧은 작업에 몇 초 을 사용한다. 그러나 더 예를 지정하지 . 그래서 정확히 무엇을 하나 구현해야합니까? 누군가가 내게 예제를 줄 수 있습니까? 내가 AsyncTask 확장하고 doInBackground 메서드 또는 뭔가 외부 클래스의 메서드를 실행하는 일부 개인 클래스가 있어야할지 모르겠다.

답변

1

:

new Thread(new Runnable(){ 
    @Override 
    public void run(){ 
     //do operation 
     //make and show notifications. Notifications are thread safe 
    } 
}}); 

알림이 앱을 통과하지 않기 때문에 당신은 작업자 스레드에서 통지 할 수 방법. 앱의 UI 스레드에 게시해야하는 경우 See here

는, 당신은과 같이 핸들러를 사용할 수 있습니다

//put this in the UI thread 
Handler handler = new Handler(); 
//then within the thread code above 
handler.post(new Runnable(){ 
    @Override 
    public void run(){ 
     //code that you want to put on the UI thread, update views or whatever 
    } 
}}); 

편집 : 대신 Handler으로 괴롭 히고, 당신이 당신의 작업자 스레드에서 runOnUiThread(...)을 사용할 수 있습니다 . 내가보기 엔 추천

+0

Greate 대답은 알림 및 UI 스레드 업데이트를 모두 포함하기 때문에 수치 스럽습니다. 나는 당신이 제공 한 질문을 찾지 못했습니다. 고맙습니다! – user3086577

+0

또한 더 좋은 방법이있을 수도 있습니다 (다른 사람들이 언급 한'Loaders'와 같은). 그러나 이것은 모든 것을 처리하는 방법이며 결코 문제를 일으키지 않으므로 다른 방법으로 익숙하지 않았습니다. – Jakar

+0

또한,'Handler' 대신'runOnUiThread'를 사용하면 적은 노력으로 동일한 기능을 제공 할 수 있습니다. – Jakar

2

핸들러를 사용할 수 있습니다 :

핵심 아이디어는 Handler을 사용하여 UI를 업데이트하는 새 Thread을 만드는 것입니다 (UI 스레드가 아닌 스레드에서 UI를 업데이트 할 수 없기 때문입니다).

공식 문서 : 당신은 스레드를 사용할 수 있습니다

http://developer.android.com/reference/android/os/Handler.html

public class YourClass extends Activity { 

    private Button myButton; 

    //create an handler 
    private final Handler myHandler = new Handler(); 

    final Runnable updateRunnable = new Runnable() { 
     public void run() { 
      //call the activity method that updates the UI 
      updateUI(); 
     } 
    }; 


    private void updateUI() 
    { 
     // ... update the UI  
    } 

    private void doSomeHardWork() 
    { 
     //.... hard work 

     // update the UI using the handler and the runnable 
     myHandler.post(updateRunnable); 
    } 

    private OnClickListener buttonListener = new OnClickListener() { 
     public void onClick(View v) { 
      new Thread(new Runnable() { 

        doSomeHardWork(); 

      }).start(); 
     } 
    }; 
} 
+0

로더 용 핸들러에 대한 두 가지 답변이 있습니다. 실제로 차이가 있습니까? 처리기는 적어도 지금은 구현하기 쉽습니다. 나는 그들에 대해 읽기 시작했습니다. – user3086577

+1

@ user3086577 db로 데이터를 가져 오는 로더를 제안하지만 선택 사항입니다. –

+0

그게 내가 필요하지만, 언급에 대한 감사, 유용 할 수도 있습니다 나중에 – user3086577

0

활동이 닫힌 경우 (백그라운드 작업)에도 계속 실행해야하는 경우 활동에 바인딩 한 서비스를 사용해야합니다. Local Service 설명서를 참조하십시오.

관련 문제