2011-06-30 33 views
0

我有一個服務啓動一個AsyncTask來從我的家庭網絡中的設備取回一些數據。當AsyncTask完成後,它會使用服務實現的onPostExecute中的回調接口將數據讀回給服務。該服務然後讀取傳遞的字符串中的信息,並根據信息做一些事情。這工作很好9/10次,但有時從asynctask傳遞的字符串爲null。從AsyncTask傳遞到服務的Android無效字符串

的AsyncTask doInBackground:

private String result = "No results"; 
@Override 
    protected Void doInBackground(Void... params) { 
      try { 
        OutputStreamWriter wr = new OutputStreamWriter(mConnection.getOutputStream()); 
        wr.write(body); 
        wr.flush(); 

        BufferedReader rd = new BufferedReader(new InputStreamReader(mConnection.getInputStream())); 
        String line; 
        while ((line = rd.readLine()) != null) { 
          result = line; 
        } 
        wr.close(); 
        rd.close(); 
      } catch (Exception e) { 
        result = e.getMessage(); 
      } 
      return null; 
    } 

    protected void onPostExecute(Void result) { 
      mListener.onHttpResponse(this.result, REQUEST_CODE); 
    } 

}

服務onHttpResponse:

@Override 
    public void onHttpResponse(String response, int REQUEST_CODE) { 
      ResponseEnterpreter mEnterpreter = new ResponseEnterpreter(response); 
      switch (REQUEST_CODE) { 
       case WidgetConstants.REQUEST_LED_STATE : 
        String artist = mEnterpreter.getArtist(); <--- NullPointerException 

ResponseEnterpreter getArtist:

public class ResponseEnterpreter { 
    private String mResponse; 


    public ResponseEnterpreter(String mResponse) { 
      this.mResponse = mResponse; 
    } 
     public String getArtist() { 
      int first_index = mResponse.lastIndexOf("&lt;dc:creator&gt;"); 
      if (first_index == -1) { 
        return null; 
      } 

      int last_index = mResponse.lastIndexOf("&lt;/dc:creator&gt;"); 
      String artist = mResponse.substring(first_index + "&lt;dc:creator&gt;".length(), last_index); 

      return unEscapeString(artist); 

    } 

據我瞭解,在resul t字符串被初始化爲「沒有結果」,並且如果沒有結果被BufferedReader檢索到「沒有結果」是應該傳遞的字符串。 mConnection設置爲3秒超時。

我真的在撓撓我的腦袋....

任何想法?

//弗雷德裏克

回答

0

的onPostExecute方法得到的值從doInBackground返回的參數,所以你應該有不同的實現這些方法:

protected String doInBackground(Void... params) { 
     try { 
       //[..] 

     } catch (Exception e) { 
       return e.getMessage(); 
     } 
     return result; 
} 

protected void onPostExecute(String result) { 
     mListener.onHttpResponse(result, REQUEST_CODE); 
} 

要覆蓋的結果在每一個循環的步驟,你最終只有文檔的最後一行:

while ((line = rd.readLine()) != null) { 
    result = line; 
} 
+0

我應該使用一個StringBuilder,然後在每個循環上執行builder.append(line),然後傳遞builder.toString()作爲返回呢? – Freddroid

+0

Ja一個StringBuilder會很好用。 – thaussma

+0

我做了改變,迄今爲止都很好。豎起大拇指! – Freddroid

相關問題