2013-05-25 55 views
0

我有以下的代碼來執行PHP腳本:onPostExecute不會被調用

public class CallPHPScript extends AsyncTask<ScriptNameAndParameters, Void, String> { 
    private Reply responder; 

    public interface Reply { 
     public void serverReply(String reply); 
    } 

    public CallPHPScript(Reply r) { 
     responder = r; 
    } 

    @Override 
    protected String doInBackground(ScriptNameAndParameters... arg) { 
     List<NameValuePair> params = arg[0].getParameters(); 
     String scriptName = arg[0].getScriptName(); 
     String json = MainActivity.makeCall(scriptName, params); 
     return json; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     Log.d("SERVER REPLY", "Server Reply: " + result); 
     responder.serverReply(result); 
    } 

} 

public static String makeCall(String scriptName, List<NameValuePair> params) { 
    String address = SERVER_ADDRESS + scriptName + ".php"; 

    Log.d("Main Activity", "Making call to server with: " + address); 

    HttpPost httpPost = new HttpPost(address); 
    HttpClient httpClient = new DefaultHttpClient(); 
    StringBuilder total = new StringBuilder(); 
    try { 
     httpPost.setEntity(new UrlEncodedFormEntity(params)); 

     // Execute HTTP Post Request 
     HttpResponse response = httpClient.execute(httpPost); 
     InputStream is = response.getEntity().getContent(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
     String line = ""; 
     // Read response until the end 
     while ((line = rd.readLine()) != null) { 
      total.append(line); 
     } 

     // Return full string 
     Log.d("CALLPHPSCRIPT", total.toString()); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return total.toString(); 
} 

雖然它似乎工作正常,唯一的輸出我可以看到的是

 // Return full string 
     Log.d("CALLPHPSCRIPT", total.toString()) 

這條線(因此我的回調)

Log.d("SERVER REPLY", "Server Reply: " + result); 

永遠不會被調用。有沒有人知道我要出錯的地方?

回答

0

剛剛意識到我應該調用

CallPHPScript callPHP = new CallPHPScript(this); 
    callPHP.execute(new ScriptNameAndParameters("get_all_profiles",new ArrayList<NameValuePair>())); 

代替

CallPHPScript callPHP = new CallPHPScript(this); 
    callPHP.doInBackground(new ScriptNameAndParameters("get_all_profiles",new ArrayList<NameValuePair>())); 

衛生署!

+1

好,當你發現了:)只是接受它作爲一個答案這是很好的,可以幫助別人! –

0

(/)

記得要優雅地關閉連接管理器和所有輸入流

} finally { 
     // When HttpClient instance is no longer needed, 
     // shut down the connection manager to ensure 
     // immediate deallocation of all system resources 
     httpclient.getConnectionManager().shutdown(); 
    } 

無需調用超在

super.onPostExecute(result); 
1

既然你解決了這個問題,你違反了線程規則AsyncTask這是#3

這裏是Threading rules才能正常工作

  1. AsyncTask類必須在UI線程上加載的類。自動從JELLY_BEAN開始自動完成 。

  2. 任務實例必須在UI線程上創建。 execute(Params ...)必須在UI線程上調用。

  3. 不要onPreExecute()onPostExecute(Result)doInBackground(Params...)onProgressUpdate(Progress...)手動調用。

  4. 的任務可以只執行一次(如果 第二試圖執行一個異常將被拋出。)