一、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等。