2013-01-11 3 views
0

asyncthread를 취소해야합니다. 내 응용 프로그램에서 나는 무거운 계산을하고 있는데, 사용자가 계산을 취소 할 수있는 능력을주고 싶다. 나는 포럼에서, 당신이 할 일을 막을 수는 없으며 DoinBackground 코드 내에서 task isCancelled = true인지 확인해야한다고 읽었습니다. 그러나 그것은 저를 위해 작동하지 않습니다.android에서 비동기 작업을 취소 할 수 없습니다.

작업 자체가 훌륭하게 끝나고 작업 자체가 끝나면 올바른 데이터가 출력됩니다.

내 응용 프로그램에서는 먼저 naredi_pdf_start (view) 함수를 호출하고 작업이 실행 중일 때 close_pdf1 (view)를 호출하면 오류가 발생합니다 (뷰를 변경하고 응용 프로그램에서 내 pdf_text1을 찾을 수 없음). publishProgress - null 포인터 예외를 호출 할 때 Textview. 나는 정말로 task.cancel (true) 메소드를 사용하는 법을 모른다 (나의 경우 : start_pdf.cancel (true))).

String progress_pdf; 
naredi_pdf start_pdf; 

public void naredi_pdf_start(View view) { 
    start_pdf=new naredi_pdf(); 
    start_pdf.execute(); 
} 

public void close_pdf1(View view) { 

    if(start_pdf!=null) { 
     Log.v("not null","not null"); 

     start_pdf.cancel(true); 
     setContentView(R.layout.other_view); //This is where 
              //I don't have TextView pdf_text1 
    } 
} 

private class naredi_pdf extends AsyncTask<Void, String, Void> { 

    protected Void doInBackground(Void... ignoredParams) { 
     progress_pdf="Calculating Statistical Data"; 

     //A LOT OF CODING 

     for(int i = 0; i < 1; i++) { 
      if(isCancelled()) { 
       break; 
      } 
      else { 
       publishProgress("Calculating team statistics"); 
      } 
     } 

     //MORE OF CODING    

     for (int i = 0; i < 1; i++) { 
      if (isCancelled()) { 
       break; 
      } 
      else { 
       publishProgress("Calculating player's BIO"); 
      } 
     } 

     //MORE OF CODING  

     for (int i = 0; i < 1; i++) { 
      if (isCancelled()) { 
       break; 
      } 
     else { 
       publishProgress("Calculating player's individual performance"); 
      } 
     } 

     return null; 
    } 

    protected void onPostExecute(Void array) { 
     //saving to database 
    } 

    protected void onProgressUpdate(String... values) { 
     progress_pdf=values[0]+"\n"+progress_pdf; 

     if (isCancelled()) { 

     } 
     else { 
      TextView pdf_text1 = (TextView) findViewById (R.id.pdf_text1); 
      pdf_text1.setText(progress_pdf); 
      // dialog(view); 
     } 
    } 
} 

답변

2

그런 짓을. setContentView()에 대한 전화가 AsyncTask.cancel()에 도달하기 전에 성공 했으므로 아마 NullPointerException이됩니다. onProgressUpdate()이 호출되면서 레이아웃이 변경되었으며 인 View이 없습니다.

AsyncTask에 관한 문서입니다.

cancel (boolean)을 호출하여 언제든지 작업을 취소 할 수 있습니다. 이 메소드를 호출하면 (자), isCancelled()에 대한 후속 호출이 true를 돌려줍니다. doInBackground (Object [])가 반환 된 후 onPostExecute (Object) 대신 onCancelled (Object)가 호출되어이 메서드를 호출 한 후 호출됩니다. 작업이 가능한 한 빨리 해제되도록하려면, 당신은 항상 doInBackground에서 주기적)의 isCancelled (의 반환 값을 확인해야 가능한 경우 (예를 들어 루프 내부.) ([] 객체) onCancelled() 이후

UI 스레드에서 실행되며 이후에 onProgressUpdate()에 대한 호출이 발생하지 않는다고 확신하는 경우 setContentView()에 전화하기 좋은 곳입니다.

이 취소 된 경우 자동 레이아웃을 변경하는 AsyncTask을 가져야한다 close_pdf1()

public void close_pdf1(View view) { 
    if(start_pdf!=null) { 
     Log.v("not null","not null"); 

     start_pdf.cancel(true); 
    } 
} 

그리고 당신은 AsyncTask

private class naredi_pdf extends AsyncTask<Void, String, Void> { 

    protected Void doInBackground(Void... ignoredParams) { // YOUR CODE HERE} 
    protected void onPostExecute(Void array) { // YOUR CODE HERE} 
    protected void onProgressUpdate(String... values) {// YOUR CODE HERE} 

    // ADD THIS 
    @Override 
    protected void onCancelled() { 
     // Do not call super.onCancelled()! 

     // Set the new layout 
     setContentView(R.id.other_layout); 
    } 
} 

변경에 재정 onCancelled(). 다행히도 NullPointerException도 발생하지 않아야합니다.하지만 코드를 시도하지 않은 :

편집 당신이 공상 느끼는 경우

, return 사용에 Rezooms 조언을 따르십시오.

for(int i = 0; i < 1; i++) { 
    if(isCancelled()) { 
     return null; 
    } 
    . 
    . 
    . 
} 
+0

고마워. 내게 잘 됐어. – SREEJITH

2

return 문은 doInBackground 방법이 아닌 break의 실행을 취소 :

여기 내 코드입니다.

+1

그는 'for' 루프를 깨고 결과적으로'return null '을 누르게됩니다. 그것은 즉시 반환 null이 더 좋을지라도, 작동합니다. – Ole

+0

예, 당신의 권리. 나는 더 정확할 수있다. :) – Rezoom

+0

예 내 코드가 이상하게 보입니다. 반환 null을 갖는 것이 더 나을 것입니다.하지만 그것은 단지 나이지만, "return null"은 doInBackground 함수를 멈추지 않습니다 ... – Gregor

0

isCancelled는 AsyncTask 클래스의 독점적 인 메서드입니다.

당신은 당신의 확장 클래스 전용 부울 속성을 정의해야한다, 나만의 문제는 당신이 AsyncTask을 취소 할 수없는이

private class myAsyncTask extends AsyncTask<Void, String, Void> { 
      private boolean isTaskCancelled = false; 

      public void cancelTask(){ 
       isTaskCancelled = true; 
      } 

      private boolean isTaskCancelled(){ 
       return isTaskCancelled; 
      } 

      protected Void doInBackground(Void... ignoredParams) { 
      //Do some stuff 
      if (isTaskCancelled()){ 
       return; 
      } 
      } 


      protected void onPostExecute(Void array) 
      { 
      //Do something 
      } 



      protected void onProgressUpdate(String... values) 
      { 
      //Do something 
      } 
    } 
관련 문제