2013-06-26 59 views
1

我有一個類,我用它從我的應用程序發送數據到一個網站。有多種方法迎合不同類型的數據,我想送,代碼提取物在這裏:數據庫從AsyncTask更新onPostExecute

public class TransmitMetrics { 
private final String request = "http://192.168.0.60/post.php"; 
private String function; 
private URL url; 
private HttpURLConnection connection; 
private String line; 
private String urlParameters; 

public void updatePhone(String device_id, String country) { 

    String make = Build.MANUFACTURER; 
    String model = Build.MODEL; 
    String sdk = Build.VERSION.SDK; 

    function = "phoneupdate"; 
    urlParameters = "function=" + function + "&device_id=" + device_id 
      + "&make=" + make + "&model=" + model + "&country=" + country 
      + "&sdk=" + sdk; 

    new sendData().execute(); 
} 

然後我有一個嵌套的AsyncTask類(送出數據),這與不能在運行的HttpURLConnection的東西交易mainUI線程,這裏的部分代碼:

private class sendData extends AsyncTask<Void, Void, Integer> { 
    @Override 
    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 
        //Proposed DB stuff here based on return code 
        //stored in the result variable. 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 

     try { 
      url = new URL(request); 
     } catch (MalformedURLException e1) { 
      e1.printStackTrace(); 
     } 

     try { 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoOutput(true); 
      connection.setDoInput(true); 
      connection.setInstanceFollowRedirects(false); 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Content-Type", 
        "application/x-www-form-urlencoded"); 
      connection.setRequestProperty("charset", "utf-8"); 
      connection.setRequestProperty("Content-Length", 
        "" + Integer.toString(urlParameters.getBytes().length)); 
      connection.setUseCaches(false); 

      DataOutputStream wr = new DataOutputStream(
        connection.getOutputStream()); 
      wr.writeBytes(urlParameters); 
      wr.flush(); 

我沒有問題的代碼,它工作正常,但是,我最近一直在努力提高應用程序中加入一個數據庫更新取決於響應從HttpURLConnection返回的代碼。 onPostExecute()是標準方式,但我不確定是否應該開始聲明數據庫連接並從onPostExecute()方法內執行數據庫更新。

我想要一些建議,如果有更好的方法來做到這一點,或者如果我不應該首先使用AsyncTask這種類型的功能。

回答

0

作爲第一個注意事項,我相信你應該有一個單獨的類來執行數據庫操作,因爲你的代碼對於一個類來說太複雜了。它似乎已經打破Single-Responsibility Principle。我會將當前的Http操作移到一個新類中。此外,保持對URL,HttpURLConnection和參數的類引用並不安全,因爲您可能在同一時間有2個正在運行的請求,並且共享這些屬性會導致意外的結果。

回到你的問題,假設sendData.execute(...)在UI線程上啓動,那麼onPostExecute(Integer)也會在UI線程上運行。數據庫操作應該在非UI線程上執行,因爲您不知道數據庫將有多大的「瘋狂」增長。所以你可以在另一個AsyncTask上移動數據庫操作 - 如果你需要數據庫操作結果。否則一個簡單的後臺線程是綽綽有餘。

+0

謝謝,這是更有意義的,我打算將HTTP位移出一個新的類,但唯一的問題是,異步任務不在onPostExecute()方法中爲您提供很大的靈活性,因爲它僅用於UI更新。如果我有一個單獨的HTTP和數據庫操作類,我可以用onPostExecute()方法調用具有有效上下文的數據庫類嗎? – bazza2000

+0

使用Handler/Thread類會更好嗎? – bazza2000

+0

*異步任務不會爲onPostExecute()方法提供很大的靈活性,因爲它只能用於UI更新*您可以在onPostExecute()方法中返回自定義對象,並且您可以靈活使用。您可以創建一個自定義的'HttpResponseObject'類,其中包含響應代碼,失敗細節以及您需要的任何內容。如果您需要額外的靈活性,可以在UI線程上返回並評估。這足夠靈活嗎? – gunar

0

是的,你可以使用httpurlconnection中的responsebody。我想你不會使用json發送或接收來自服務器的數據。最好使用json格式,它有助於以對象形式獲取數據或從服務器端獲取數據。

0

您可以使用Aynctask執行任何執行其他操作的任務,並希望在UI上執行該操作的結果。以您的示例爲例,您可以使用asyntask在onBackground方法中執行一些數據庫和光標操作,並在onPostExecute方法,相同的規則可以應用於任何非UI操作。

+0

嗯,這導致我到另一個查詢,然後關於通過onPostExecute()獲取「上下文」,我需要將它傳遞到頂級類TransmitMetrics,然後從那裏再次傳遞給嵌套的sendData類這樣我可以在onPostExecute()方法中使用數據庫連接。對我來說似乎有點醜陋?有沒有更好的方法來做到這一點? – bazza2000

+0

您可以在您的類TransmitMetrics中創建setter getter方法,並通過構造函數在sendData asynctask中傳遞它。在sendData類中創建一個默認構造方法。 像「新發送數據(上下文).execute()」 –