2013-04-15 2 views
1

코드에서 onPostExecute가 호출되지 않는 이유를 설명 할 수 없습니다. 이전에 다른 앱으로이 정확한 코드를 성공적으로 사용했습니다. 그것은 'onPreExecute'를 인쇄하고 return result; 직전에 doInBackground에서 JSON을 성공적으로 가져 왔지만 onPostExecute는 수퍼 호출과 함께 아무 것도 인쇄하지 않으며 UI 문자열에 내 문자열을 반환하지 않습니다. 어떤 아이디어?onPostExecute가 ASyncTask에 의해 호출되지 않습니다. execute()

public class PrivateLoadFromServer extends AsyncTask<String, Integer, String> { 

    InputStream is = null; 
    String result = null; 
    String error_text=""; 
    JSONObject j = null; 
    String url; 
    SQLiteOpenHelper helper; 
    CustomActivity activity; 
    private Context context; 
    private ProgressDialog dialog; 
    private int count; 
    String employee; 
    String text; 

    public PrivateLoadFromServer(CustomActivity activity,String employee,String url){ 
     this.url=url; 
     this.employee=employee; 
     this.activity=activity; 
    } 

    @Override 
    protected void onPreExecute() { 
     system.out.println("onPreExecute"); 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     System.out.println("onPostExecute"); 

     activity.setJSONResult(result); 
     /* 
     if(result!=null){ 
      System.out.println("Task reported successful"); 
      taskHandler.taskSuccessful(this.result); 
      activity.setJSONResult(this.result); 
     } else { 
      taskHandler.taskFailed(); 
     } 
     */ 
     //return; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     System.out.println("Running aSyncTask"); 

      // Successful code to get JSON result string from server omitted. 

     System.out.println("Raw at doInBackground: " + result); 
    return result; 

편집 : 원래이 게시 한 경우, 나는이 같은 CustomActivity의 내부 클래스로 호출하여 명시 적으로 코드 어딘가에 AsyncTask를 취소하는 경우

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_login); 
    helper=new DBHelper(this); 
    loadBasicData(); 

} 

private void loadBasicData() { 

    // If you can encode all of these into one JSON Object, cool. 

    String url="*****" //Omitted URL. 
    String employee=null; 

    PrivateLoadFromServer syncTask = new PrivateLoadFromServer(this,employee,url); 

    syncTask.execute(); 

    try { 
     syncTask.get(15000, TimeUnit.MILLISECONDS); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TimeoutException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    System.out.println("JSONResult at Activity:"+jsonResult); // jsonResult is null 

    } 
} 

    public void setJSONResult(String result){ 
    System.out.println("setJSONResult"+result); 
    this.jsonResult=result; // jsonResult is a field in the Activity. 
} 
+2

비동기 작업을 수행하고 메인 쓰레드를 호출하는 것을 차단하기 위해 AsyncTask 클래스를 사용하는 것은 의미가 없다. '.get()'메서드 또한, 발생하는 문제는 항상 발생하거나로드하는 동안 화면을 회전하는 경우에만 발생합니다. – rciovati

+0

항상 발생하며 회전과는 관련이 없습니다. 내 로컬 데이터베이스에로드하는 메서드를 호출하기 전에 JSON 결과를 갖도록 기본 스레드를 차단해야합니다. 그렇지 않으면 null 포인터가 실패합니다. –

+1

네트워크 요청이 완료된 후'AsyncTask'에서 데이터베이스 로딩을 수행 할 수 없습니까? 이 문제 (이것이 될 수도 있음)가 확실하지 않지만, 현재 접근 방식이 다른 문제 (예 : ANR)를 유발할 수 있습니다. – rciovati

답변

0

의 JSON 결과는 AsyncTask.java의 소스 코드를 참조 (이 메소드로부터 반환됩니다. 당신이 출력에 직접 메소드를 호출 할 수 있습니다.

try { 
    setJSONResult(syncTask.get(15000, TimeUnit.MILLISECONDS)); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} catch (ExecutionException e) { 
    e.printStackTrace(); 
} catch (TimeoutException e) { 
    e.printStackTrace(); 
} 
+1

아직 onPostExecute를 호출하지는 않지만 UI 스레드에 결과를 가져올 수 있습니다. 작품, 고마워요 :) 나는 주말에 주석 작성자가 결국'.get() \을 제거하기 위해 제안한대로 데이터베이스 작업을 ASync 스레드로 가져 오는 것으로 끝날 것입니다. –

0

점검하기 전에이 postExecute을 수 . 당신이 얻을를 호출하기 때문에

+0

아무 곳이나 취소 할 수 없습니다. –

+0

메인 스레드를 차단하는 이유는 무엇입니까? 그건 말이 안되요. –

+0

메인 포스트에 대한 내 의견보기. 예를 들면. 여기 : https://groups.google.com/forum/?fromgroups=#!topic/android-developers/YcuihmCP2Fc –

0

onPostExecute()를 호출 메인 UI 쓰레드에서 UI 쓰레드가 차단되고 있다는 것을 의미한다.

관련 문제