首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从AsyncTask传递给服务的Android空字符串

从AsyncTask传递给服务的Android空字符串
EN

Stack Overflow用户
提问于 2011-06-30 14:30:32
回答 1查看 282关注 0票数 0

我有一个服务,它启动一个AsyncTask来从我的家庭网络中的设备检索一些数据。当AsyncTask完成时,它使用服务实现的onPostExecute中的回调接口将读取的数据传递回服务。然后,该服务读取传递的字符串中的信息,并根据该信息执行操作。这很有效,9/10倍,但有时从asynctask传递的字符串是空的。

AsyncTask doInBackground:

代码语言:javascript
复制
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:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
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);

    }

据我所知,结果字符串被初始化为"No results“,如果BufferedReader没有检索到任何结果,"No Result”就是应该传递的字符串。mConnection设置为3秒超时。

我真的很想知道这件事...

有什么想法吗?

// Fredrik

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-30 15:46:38

onPostExecute方法将从doInBackground返回的值作为参数获取,因此您应该以不同的方式实现这些方法:

代码语言:javascript
复制
protected String doInBackground(Void... params) {
        try {
                //[..]

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

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

您将覆盖每个循环步骤中的结果,并且仅以文档的最后一行结束:

代码语言:javascript
复制
 while ((line = rd.readLine()) != null) {
     result = line;
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6530802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档