一、okhttp简单实用:
- 一般的get请求
- 一般的post请求
- 基于Http的文件上传
- 文件下载
- 加载图片
- 支持请求回调,直接返回对象、对象集合
- 支持session的保持
二、实用教程
1、添加android项目
2、最新的jar okhttp he latest JAR,添加依赖就可以用了。
注意:okhttp内部依赖okio,别忘了同时导入okio:
gradle: compile 'com.squareup.okio:okio:1.5.0'
最新的jar地址:okio the latest JAR
3、MainActivity代码
package com.example.okhttp; import java.io.IOException; import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response; import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast; public class MainActivity extends Activity { private Button btn;
private String json_str;
private ImageView iv;
private Bitmap bitmap;
private String url1_json = "http://android2017.duapp.com/test1.jsp";
private String url2_img = "http://www.admin10000.com/UploadFiles/Document/201307/14/20130714201135796898.JPG"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("Thread-id:", ""+Thread.currentThread().getId()); iv = (ImageView)findViewById(R.id.imageView1);
btn = (Button)findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url1_json)
.build();
//希望得到一个response
//为了防止卡顿,把获取response掉到后台进程去
//调度
Call call = client.newCall(request);
call.enqueue(new Callback() { //子线程运行
@Override
public void onResponse(Response response) throws IOException { Log.i("Thread-id:", ""+Thread.currentThread().getId());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//读取文本
json_str = response.body().string();
//读取二进制
//bitmap = BitmapFactory.decodeStream( response.body().byteStream());
//iv.setImageBitmap(bitmap); //Log.i("okHttp", json_str);
runOnUiThread(new Runnable() { @Override
public void run() {
Log.i("Thread-id:", ""+Thread.currentThread().getId());
Toast.makeText(MainActivity.this, json_str, 500).show();
//iv.setImageBitmap(bitmap);
}
});
//Toast.makeText(MainActivity.this, json_str, 500).show();
} @Override
public void onFailure(Request arg0, IOException arg1) {
// TODO Auto-generated method stub }
});
}
});
}
}
onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()
获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes()
;如果你想拿到返回的inputStream,则调用response.body().byteStream()
看到这,你可能会奇怪,竟然还能拿到返回的inputStream,看到这个最起码能意识到一点,这里支持大文件下载,有inputStream我们就可以通过IO的方式写文件。不过也说明一个问题,这个onResponse
执行的线程并不是UI线程。的确是的,如果你希望操作控件,还是需要使用handler等。