2013-05-25 3 views
0

У меня есть следующий код для выполнения сценария РНР: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>())); 

Doh!

+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

Так как вы решили проблему, вы нарушили Правило Threading AsyncTask, которое является № 3

Вот Threading rules работать класс правильно

  1. AsyncTask класс должен быть загружен в потоке пользовательского интерфейса. Это делается автоматически начиная с JELLY_BEAN.

  2. Экземпляр задачи должен быть создан в потоке пользовательского интерфейса. execute (Params ...) должен быть вызван в потоке пользовательского интерфейса.

  3. Не называйте onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...) вручную.

  4. Задача может быть выполнена только один раз (исключение будет сгенерировано, если второго исполнения попытки.)

Смежные вопросы