2011-06-30 32 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

相关问题