2013-07-13 3 views
1

나는 AsyncTask을 확장하는 클래스 AsycnIntegerCounter을 가지고 있으며 doInBackground()onPostExecute()이 동일한 것으로 오버라이드되었습니다. 내 메인 스레드에서 실행할 수있는 개체를 만들고 AsycnIntegerCounter의 정적 실행 메서드를 사용하여 실행할 수 있습니다. AsycnIntegerCounter.execute(Runnable)Asynctask에서 실행 가능한 실행

AsycnIntegerCounter을 사용하여 실행 파일을 실행할 때 (정확히 말하면 AsycnTask 개체를 사용하여) 실행되는 상황을 정확히 이해할 수있는 사람이 있습니까?

언제 이것을 사용할 수 있습니까? 그리고 Thread 객체를 사용하여 실행하는 것보다 어떤 이점이 있습니까?

코드 샘플 :

AsycnIntegerCounter integerCounter1 = new AsycnIntegerCounter(next,0); 

AsycnIntegerCounter.execute(new Runnable() { 

      @Override 
      public void run() { 

       int i = 100; 
       while(i<=105){ 

        i++; 
        try { 
         Thread.sleep(1000); 

        } catch (InterruptedException e) { 

         e.printStackTrace(); 
        } 
       } 
      } 
     }); 
+0

AsyncIntegerCounter라는 클래스가 없으므로 작성한 사용자 정의 클래스입니까? –

+0

예 Onur, AsyncTask를 확장 한 클래스입니다. 질문에서 언급했습니다. – Pravy

답변

1

그것은 execute()와 동일합니다하지만 실행됩니다 대신 doInBackround 기능을 실행 백그라운드에서 Runnable. onPreExecute와 onPostExecute는 같지만 여러 개의 실행 파일이있을 때 유용 할 수 있습니다.

Thread.execute 또는 Executor 이상의 이점은 정확히 onPreExecuteonPostExecute을 전후로 호출하는 것 같습니다.

+0

Alex에게 답장을 보내 주셔서 감사합니다.하지만 다음과 같은 부분을 이해하지 못했습니다. "같은 onPreExecute 및 onPostExecute가 있지만 여러 개의 실행 파일이있을 때 유용 할 수 있습니다." 또한 runnable이 해당 작업을 마친 후 AsycnIntegerCounter 클래스의 onPostExecute()로 이동하지 않는 execute() 컨트롤을 사용하여 runnable을 실행할 때 예상되는 동작입니까? – Pravy

1

지금까지 내가 그것을 AsyncTask 클래스처럼하지만 AsynchTask 한 번만 실행하지만이 클래스가 제공 그림과 같이 두 개의 things- :

  1. 그것은 너무 루프를 사용하면 작업이 여러 번 실행하고 싶은 경우는, 혜택 은 웹 서비스에서 연속 데이터를 확인하는 것과 같습니다.
  2. Thread.sleep을 사용하여 작업의 실행 시간을 수정 했으므로 작업이 완료되면 이 완료되어이 작업의 시간이 Thread.wait()으로 수정됩니다.
1

@Alex는 매우 좋은 지적입니다. 당신이 실행하고자하는 많은 메소드 인 M1(), M2() 등을 가지고 있다고 가정하십시오. 이들 중 하나를 실행하기 전에 Before() 메쏘드를 실행해야하고 After() 메쏘드를 실행해야한다고 가정하십시오.

즉, 방법의 순서 간다 : 당신이 순서를 달성 할 수 onPostExecuteonPreExecute에서 Before()After()을 놓음으로써

Before(); 
M1(); 
After(); 

또는

Before(); 
M2(); 
After(); 

. 실행 가능한 M을함으로써, 당신은 다음 달성 할 수있는 다음 Runnable

Before(); 
WhateverRunnableYouWant(); 
After(); 

을 배경으로, 비 UI 쓰레드, 코드에 따라.

+0

Neil에게 감사드립니다. 그러나 execute 메소드를 사용하여 runnable을 실행할 때 컨트롤은 절대로 onPostExecute() 또는 onPreExecute()로 이동하지 않습니다. 이 경우 호출 할 코드를 추가해야합니까 ?? – Pravy

+0

'AsycnIntegerCounter'라고 적어 주시면 감사하겠습니다. 감사합니다. –

4

Runnable -task이 아닌 배경 작업 대신 doInBackground

  • 를 구현하는 Runnable를에 정의되어

    static void execute(Runnable) 
    


    AsyncTask execute(Params...) 
    
    1. 사이의 근본적인 차이의 부부가있다 의 내부 스레드 통신 메커니즘을 사용하여 AsyncTask. 따라서 onPreExecute이나 onPostExecute도 호출되지 않습니다. 첫 번째 API 수준에서 추가 된 반면
    2. 후자는 모든 플랫폼에서 사용할 수 11

    execute(Runnable)을 사용하는 경우의 장점은 작업이 내부 스레드 풀, 즉의 작업자 스레드에서 실행 할 수 있다는 것입니다 새로운 쓰레드를 생성 할 필요가 없습니다.

  • +0

    감사 정보 AndersGransson – Pravy

    +0

    작업자 스레드 란 무엇입니까? –

    관련 문제