2016-09-03 2 views
-1

으로 나는 클래스 본체가 있다고 가정 .Execute를 문 다음에 AsyncTask를 클래스의 결과를 사용할 수 : (그것은 클래스의 단지 대략적인 디자인 ..)은 내가

class XYZ 
    { 


     //Some Code here 
     submitBTN.setOnClickListener(..){ 
        ABC obj=new ABC(); 
        obj.execute(); 
        Toast(obj.result).show(); 
       } 

     class ABC extends AsynTask<String,Void,String>{ 
     String result=null; 
     .. 
     .. 
     doInBackground(..){ 
       .. 
       .. 
      return "success"; 

      } 
      onPostExecute(String result){ 
       this.result=result; 
       } 
    } 
    } 

내 질문 윌 토스트 쇼 "성공이다 "또는"null "이 표시됩니다. 백그라운드에서 다른 스레드를 시작하기 때문에obj.execute는 블로킹 문이거나 그렇지 않습니다. 컨트롤이 .execute 문 다음 명령문으로 이동하거나 백그라운드 스레드가 완료 될 때까지 기다릴 것입니까?

+0

호 불가능을 사용할 수 있습니다. 토스트는 asynctask가 실행되기 전에 호출되며 인증 전에 종료됩니다. AsyncTask의 onPostExecute()에 토스트를 넣어야합니다. – greenapps

+0

AsyncTask가 차단되지 않습니다. 결과는 null이 될 가능성이 높습니다 –

+1

AsyncTask가 별도의 클래스이기 때문에 [OnPostExecute()의 결과를 주 활동으로 가져 오는 방법] 가능한 중복?] (http://stackoverflow.com/questions/12575068/how-to- asynctask-is-a) –

답변

0

Asyctask 작업이 자체 스레드에서 실행되므로 컨트롤이 토스트로 이동합니다. 그러나 obj.result는 결과가 토스트 실행 전에 설정된다는 보장이 없기 때문에 null 결과를 제공합니다.

+0

을 의미하는 obj.execute는 non-blocking statement입니다. 저는 AsynTask Class를 별도로 가지고 있고 Toast에서 성공을 보여주고 싶습니다. 그렇다면 어떻게 할 수 있습니까? 그렇다면 어떻게해야할까요? – Johny

+0

예. 비 차단 –

0

당신은 인터페이스

public interface OnStuffDone{ 
void onResult(String result); 
} 

public AsyncTask<String,Void,String> abc (OnStuffDone onStuffDone){ 
    return new AsyncTask<String,Void,String> 
     ... 
    doInBackground(..){ 

     ... 
     return "success"; 

     } 
     onPostExecute(String result){ 
      onStuffDone.onResult(result); 
      } 

     } 

     abc(new OnStuffDone 
     ... 
     @Override 
    public void onResult(String result){ 
    //Show result 
    } 
    ).execute() 
+0

맞습니다. 내가 바꿨습니다. –