雨落love

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

  

posted on 2016-12-11 19:06  雨落love  阅读(189)  评论(0编辑  收藏  举报