从AsyncTask传递到服务的Android无效字符串
问题描述:
我有一个服务启动一个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("<dc:creator>");
if (first_index == -1) {
return null;
}
int last_index = mResponse.lastIndexOf("</dc:creator>");
String artist = mResponse.substring(first_index + "<dc:creator>".length(), last_index);
return unEscapeString(artist);
}
据我了解,在resul t字符串被初始化为“没有结果”,并且如果没有结果被BufferedReader检索到“没有结果”是应该传递的字符串。 mConnection设置为3秒超时。
我真的在挠挠我的脑袋....
任何想法?
//弗雷德里克
答
的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;
}
我应该使用一个StringBuilder,然后在每个循环上执行builder.append(line),然后传递builder.toString()作为返回呢? – Freddroid
Ja一个StringBuilder会很好用。 – thaussma
我做了改变,迄今为止都很好。竖起大拇指! – Freddroid