我正在尝试编写一个应用来读取网址中的文本文件,例如“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
答案 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);
}
}
}
这是截图
希望这有帮助!
答案 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);
}
});