2013-04-15 118 views
1

我無法解釋爲什麼onPostExecute沒有在我的代碼中被調用。我以前已經成功使用幾乎這個確切的代碼與不同的應用程序。它打印'onPreExecute'和從doInBackground獲取JSON的成功結果,只是在return result;之前,但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內部類是這樣的:

@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結果,或者使用空指針失敗。 –

+1

網絡請求完成後,你不能在'AsyncTask'中執行數據庫加載嗎?我不確定這是否是問題(可能是),但肯定您目前的方法會導致您遇到其他問題(例如ANR)。 – rciovati

回答

0

因爲你調用get,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線程,所以作品,非常感謝:)我可能會最終將數據庫操作引入ASync線程,因爲主要的帖子評論者最後建議爲了除去'.get()'。 –

0

確認您是否明確在代碼中取消的AsyncTask的地方,才能夠postExecute 。

+0

沒有呼叫在任何地方取消。 –

+0

你爲什麼阻止你的主線程?這沒有任何意義。 –

+0

請參閱我對主帖的評論。相同的是,例如在這裏:https://groups.google.com/forum/?fromgroups=#!topic/android-developers/YcuihmCP2Fc –

0

onPostExecute()被調用如果它沒有被調用,這意味着你的UI線程被阻塞做其他事情。

相關問題