2016-07-22 3 views
0

나는 약간 구속력이 있습니다. 나는 그 값을 업데이트하는 진행 대화 상자가있는 응용 프로그램을 작성 중입니다. 나는 하나를 만드는 방법에 대한이 튜토리얼을 다음되었고,이 코드로 결국 지금Android - 스레드 실행 완료시기 결정

progress = new ProgressDialog(this); 
progress.setMessage("Scanning for Devices"); 
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
progress.setIndeterminate(true); 
progress.setProgress(0); 
progress.show(); 

final int totalProgressTime = 100; 
final Thread t = new Thread() { 
    @Override 
    public void run() { 
     int jumpTime = 0; 
     BTAdapter.startDiscovery(); 

     while(jumpTime < totalProgressTime) { 
      try { 
       sleep(250); 
       jumpTime += 5; 
       progress.setProgress(jumpTime); 
      } 
      catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
}; 
t.start(); 

그러나, 진행 100 안타의 while() 루프 더 이상 실행하고 지금은 아주 프로그래밍 방식의 경우 알 수 없다 진행이 완료되었는지 여부. 코드와 마찬가지로 스레드는 진행률이 100이 될 때까지 실행됩니다. postExecute 함수가있는 비동기 작업과 달리 스레드는 자체를 중지하고 재정의 또는 청취자에게 알려주는 함수가없는 것 같습니다 실행 완료.

누군가 스레드가 작업 실행을 중단했거나 작업 완료시 외부 함수를 호출하는 방법을 아는 사람이 있습니까?

while 루프를 수행 한 후 onExecuteAfter 함수를 호출하여 UI 스레드를 업데이트하려고했지만 쓸모가 없었습니다.

모든 도움을 주시면 대단히 감사하겠습니다.

+1

* 스레드가 멈추는 기능이없는 것 같습니다. * : 실행이 끝날 때 실행이 끝납니다. * 작업이 끝나면 외부 함수를 호출하십시오. * 그런 것은 없습니다. 당신은 스스로 구현해야합니다. – Blackbelt

+0

ui가 아닌 스레드에서 ui에 대한 코드를 실행하려면 activity.runOnUiThread()를 사용하십시오. – Ramin

+0

Rxjava가 요청에 부딪 힐 수 있습니다. – Harlan

답변

1

아마도 알 수 있듯이 UI가 아닌 스레드에서는 실제로 UI 작업을 수행 할 수 없습니다. 스레드가 완료되면

이러한 상황에서 일반적인 방법은 Runnable를 작성하려면 컨텍스트 또는 처리기를 사용하는 것입니다

// Created in UI thread as a local instance variable in 
    // the Fragment or Activity 
    Handler mHandler = new Handler(); 

    .... 

    @Override 
    public void run() { 
     .... 
     while(...) { 
      ....stuff... 
     } 
     mHandler.post(new Runnable() { 
      @Override 
      void run() { 
       ... do something useful in the UI thread ... 
      } 
     }); 
    } 

당신은 호스트에서 실행 가능한 로컬 멤버를 만들 수 있습니다 당신이 원하는 경우 프래그먼트 또는 액티비티를 저장하고, 모든 View 객체는 필요에 따라 Handler 대신 사용할 수있는 Post (Runnable) 메소드를 가지고 있음을 기억하자.

0
@Override 
public void run() { 
    // Handle 'doInBackground' work here 
    while(jumpTime < totalProgressTime) { 
     try { 
      sleep(250); 
      jumpTime += 5; 
      progress.setProgress(jumpTime); 
     } 
     catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    // Handle 'postExecute' work here. 
    doUiWork(); 
} 

private void doUiWork() { 
    runOnUiThread(new Runnable() { 
     progress.setVisibility(View.GONE); 
    }); 
}