使用okHttp从URL获取文本时出现逻辑错误

时间:2015-10-27 21:09:49

标签: android android-asynctask okhttp

我正在尝试编写一个应用来读取网址中的文本文件,例如“http://chemvaaj.xzn.ir/test/words.txt” 它似乎是正确的,但它不会返回它应该的东西:\

这是我的代码:

   public  String DL (){
    OkHttpHandler handler = new OkHttpHandler();
     String text ="";
    try {
        text = handler.execute().get();


        if (text!= null && text.length()> 0){

            System.out.println("not empty");

            return text;
        }

    } catch (Exception e) {
            text= "empty !!";
    }
    return text;
}

这里是OkHttpHandler class:

public class OkHttpHandler extends AsyncTask<Void, Void, String> {

private final String DB_URL = "http://chemvaaj.xzn.ir/test/words.txt";

OkHttpClient httpClient = new OkHttpClient();

@Override
protected String doInBackground(Void... params) {

    Request.Builder builder = new Request.Builder();
    builder.url(DB_URL);

    Request request = builder.build();

    try {

        Response response = httpClient.newCall(request).execute();
        return response.body().toString();

    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    Log.e("ANSWER", "" + s);
}
}

这是调用DL()函数后的logcat:

10-28 00:23:25.167 17288-17288/erfan.bagheri.chemvaaj E/ANSWER﹕ com.squareup.okhttp.internal.http.RealResponseBody@423bc6b8

5 个答案:

答案 0 :(得分:3)

您应该将return response.body().toString();替换为return response.body().string();

请参阅我的以下工作示例代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.textView);
        new GetFileRequest().execute();
    }
...
private class GetFileRequest extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... voids) {
            try {
                OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder()
                        .url("http://chemvaaj.xzn.ir/test/words.txt")
                        .build();
                Response response = client.newCall(request).execute();
                return response.body().string();
            } catch (IOException e) {
                e.printStackTrace();
                return e.toString();
            }
        }
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if (mTextView != null && result != null) {
                mTextView.setText(result);
            }
        }
    }

这是截图

BNK's screenshot

希望这有帮助!

答案 1 :(得分:1)

首先,请检查AsyncTask的工作原理。 Here's the official,易于理解如何使用。

然后您会发现方法execute()返回任务本身,而不是结果String对象。

似乎OkHttpClient返回的Response对象可以通过以下方式转换为字符串:

response.body().toString();

再多一个提示:请避免在任何方法中返回null,这被认为是非常糟糕的做法。

答案 2 :(得分:1)

OkHttpClient以错误的方式使用(假设您要使用异步)。 OkHttp是一个功能齐全的Http客户端库,它本身实现了异步请求。 所以不需要Android AsyncTask。

这是正确的方法:

private final OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
        .url("http://chemvaaj.xzn.ir/test/words.txt")
        .build();

client.newCall(request).enqueue(new Callback() {

      @Override public void onResponse(Response response) throws IOException {
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

        System.out.println(response.body().string());
      }

      @Override public void onFailure(Request request, Throwable throwable) {
        throwable.printStackTrace();
      }
});

答案 3 :(得分:0)

我不熟悉OkHttpClient但是从日志中我猜测身体响应是一个复杂的对象,它没有toString(),它会向你显示一个人类可读的响应。您可能必须打印该对象的特定成员才能获得可读的响应。

答案 4 :(得分:0)

试试这个

OkHttpClient和回调:

OkHttpClient client = new OkHttpClient();

            Request request = new Request.Builder()
                    .url("http://publicobject.com/helloworld.txt")
                    .build();



            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    e.printStackTrace();
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {

                    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

//                    Headers responseHeaders = response.headers();
//                    for (int i = 0; i < responseHeaders.size(); i++) {
//                        System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
//                    }
//                    System.out.println(response.body().string());

                    InputStream in = response.body().byteStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                    String result, line = reader.readLine();
                    result = line;
                    while((line = reader.readLine()) != null) {
                        result += line;
                    }
                    System.out.println(result);


                }
            });