您的位置:首页 > 理论基础 > 计算机网络

Android使用OkHttp实例,以及OkHttp方法封装

2017-10-12 22:45 549 查看
本文在Android中使用OkHttp3实现数据的上传获取,图片的下载

一、在AndroidStudio中新建项目



二、在build.gradle中添加依赖

[html] view
plain copy

compile 'com.squareup.okhttp3:okhttp:3.6.0'



三、新建utils包,并在包中新建OkManager.java 类

[java] view
plain copy

package cc.example.com.utils;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.Handler;

import android.os.Looper;

import org.json.JSONException;

import org.json.JSONObject;

import java.io.IOException;

import java.util.Map;

import okhttp3.Call;

import okhttp3.Callback;

import okhttp3.FormBody;

import okhttp3.MediaType;

import okhttp3.OkHttpClient;

import okhttp3.Request;

import okhttp3.RequestBody;

import okhttp3.Response;

/**

* Created by Administrator on 2017/2/15 0015.

* 封装工具类

* 这一个类主要将OkHttp3工具类进行封装,用于对数据的传输,包括Spring,Json,img,表单等数据的提交与获取

*/

public class OkManager {

private OkHttpClient client;

private volatile static OkManager manager; //防止多个线程访问时

private final String TAG = OkManager.class.getSimpleName(); //获得类名

private Handler handler;

//提交json数据

private static final MediaType JSON = MediaType.parse("application/json;charset=utf-8");

//提交字符串数据

private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown;charset=utf-8");

private OkManager() {

client = new OkHttpClient();

handler = new Handler(Looper.getMainLooper());

}

//采用单例模式获取对象

public static OkManager getInstance() {

OkManager instance = null;

if (manager == null) {

synchronized (OkManager.class) { //同步代码块

if (instance == null) {

instance = new OkManager();

manager = instance;

}

}

}

return instance;

}

/**

* 请求返回的是JSON字符串

*

* @param jsonValue

* @param callBack

*/

private void onSuccessJsonStringMethod(final String jsonValue, final Fun1 callBack) {

handler.post(new Runnable() {

@Override

public void run() {

if (callBack != null) {

try {

callBack.onResponse(jsonValue);

} catch (Exception e) {

}

}

}

});

}

/**

* 请求返回相应结果的是Json对象

*

* @param jsonValue

* @param callBack

*/

private void onSuccessJsonObjectMethod(final String jsonValue, final Fun4 callBack) {

handler.post(new Runnable() {

@Override

public void run() {

if (callBack != null) {

try {

callBack.onResponse(new JSONObject(jsonValue));

} catch (JSONException e) {

}

}

}

});

}

/**

* 返回响应的对象是一个字节数组

*

* @param data

* @param callBack

*/

private void onSuccessByteMethod(final byte[] data, final Fun2 callBack) {

handler.post(new Runnable() {

@Override

public void run() {

if (callBack != null) {

try {

callBack.onResponse(data);

} catch (Exception e) {

}

}

}

});

}

private void onSuccessImgMethod(final Bitmap bitmap, final Fun3 callBack) {

handler.post(new Runnable() {

@Override

public void run() {

if (callBack != null) {

try {

callBack.onResponse(bitmap);

} catch (Exception e) {

}

}

}

});

}

/**

* 同步请求,在Android开发中不常用,因为会阻塞UI线程

*

* @param url

* @return

*/

public String synaGetByUrl(String url) {

//构建一个Request请求

Request request = new Request.Builder().url(url).build();

Response response = null;

try {

response = client.newCall(request).execute(); //execute用于同步请求数据

if (response.isSuccessful()) {

return response.body().string();

}

} catch (Exception e) {

}

return null;

}

/**

* 异步请求,请求返回Json字符串

*

* @param url

* @param callback

*/

public void asyncJsonStringByURL(String url, final Fun1 callback) {

final Request request = new Request.Builder().url(url).build();

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

//enqueue是调用了一个入队的方法

@Override

public void onFailure(Call call, IOException e) {

e.printStackTrace();

}

@Override

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

if (response != null && response.isSuccessful()) {

onSuccessJsonStringMethod(response.body().string(), callback);

}

}

});

}

/**

* 异步请求,请求返回Json对象

*

* @param url

* @param callback

*/

public void asyncJsonObjectByUrl(String url, final Fun4 callback) {

final Request request = new Request.Builder().url(url).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 != null && response.isSuccessful()) {

onSuccessJsonObjectMethod(response.body().string(), callback);

}

}

});

}

/**

* 异步请求,请求返回的byte字节数组

*

* @param url

* @param callback

*/

public void asyncGetByteByUrl(String url, final Fun2 callback) {

final Request request = new Request.Builder().url(url).build();

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

@Override

public void onFailure(Call call, IOException e) {

}

@Override

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

if (response != null && response.isSuccessful()) {

onSuccessByteMethod(response.body().bytes(), callback);

}

}

});

}

/**

* 异步请求,请求返回图片

*

* @param url

* @param callback

*/

public void asyncDownLoadImgtByUrl(String url, final Fun3 callback) {

final Request request = new Request.Builder().url(url).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 != null && response.isSuccessful()) {

byte[] data = response.body().bytes();

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

onSuccessImgMethod(bitmap, callback);

System.out.println(data.length);

}

}

});

}

/**

* 模拟表单的提交

*

* @param url

* @param param

* @param callback

*/

public void sendComplexForm(String url, Map<String, String> param, final Fun4 callback) {

FormBody.Builder form_builder = new FormBody.Builder(); //表单对象,包含以input开始的对象,模拟一个表单操作,以HTML表单为主

//如果键值对不为空,且值不为空

if (param != null && !param.isEmpty()) {

//循环这个表单,zengqiang for循环

for (Map.Entry<String, String> entry : param.entrySet()) {

form_builder.add(entry.getKey(), entry.getValue());

}

}

//声明一个请求对象体

RequestBody request_body = form_builder.build();

//采用post的方式进行提交

Request request = new Request.Builder().url(url).post(request_body).build();

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

@Override

public void onFailure(Call call, IOException e) {

}

@Override

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

if (response != null && response.isSuccessful()) {

onSuccessJsonObjectMethod(response.body().string(), callback);

}

}

});

}

/**

* 向服务器提交String请求

*

* @param url

* @param content

* @param callback

*/

public void sendStringByPost(String url, String content, final Fun4 callback) {

Request request = new Request.Builder().url(url).post(RequestBody.create(MEDIA_TYPE_MARKDOWN, content)).build();

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

@Override

public void onFailure(Call call, IOException e) {

}

@Override

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

if (response != null && response.isSuccessful()) {

onSuccessJsonObjectMethod(response.body().string(), callback);

}

}

});

}

//回调

public interface Fun1 {

void onResponse(String result);

}

interface Fun2 {

void onResponse(byte[] result);

}

public interface Fun3 {

void onResponse(Bitmap bitmap);

}

public interface Fun4 {

void onResponse(JSONObject jsonObject);

}

}

四、编写activity_main.xml

[html] view
plain copy

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

<Button

android:id="@+id/test"

android:layout_width="match_parent"

android:layout_height="50dp"

android:text="用于获取图片" />

<ImageView

android:id="@+id/testImageView"

android:layout_width="match_parent"

android:layout_height="100dp"

/>

<Button

android:id="@+id/getjson"

android:layout_width="match_parent"

android:layout_height="50dp"

android:text="获取Json数据请求" />

<Button

android:id="@+id/button3"

android:layout_width="match_parent"

android:layout_height="50dp"

android:text="用于登录验证" />

</LinearLayout>

五、编写MainActivity.java

[java] view
plain copy

package cc.example.com.datatransimission;

import android.graphics.Bitmap;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.ImageView;

import org.json.JSONObject;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import cc.example.com.utils.OkManager;

import okhttp3.Call;

import okhttp3.Callback;

import okhttp3.OkHttpClient;

import okhttp3.Request;

import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

private Button testButton, getJsonButton, button3;

private ImageView testImageView;

private final static int SUCCESS_SATUS = 1;

private final static int FAILURE = 0;

private final static String Tag = MainActivity.class.getSimpleName();

private OkManager manager;

private OkHttpClient clients;

//图片下载的请求地址

private String img_path = "http://192.168.191.1:8080/OkHttp3Server/UploadDownloadServlet?method=download";

//请求返回值为Json数组

private String jsonpath = "http://192.168.191.1:8080/OkHttp3Server/ServletJson";

//登录验证请求

private String login_path="http://192.168.191.1:8080/OkHttp3Server/OkHttpLoginServlet";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

testButton = (Button) findViewById(R.id.test);

getJsonButton = (Button) findViewById(R.id.getjson);

testImageView = (ImageView) findViewById(R.id.testImageView);

button3 = (Button) findViewById(R.id.button3);

//-----------------------------------------------------------------------------------------

manager = OkManager.getInstance();

getJsonButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

manager.asyncJsonStringByURL(jsonpath, new OkManager.Fun1() {

@Override

public void onResponse(String result) {

Log.i(Tag, result); //获取JSON字符串

}

});

}

});

//-------------------------------------------------------------------------

//用于登录请求测试,登录用户名和登录密码应该Sewrver上的对应

button3.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Map<String, String> map = new HashMap<String, String>();

map.put("username", "123");

map.put("password", "123");

manager.sendComplexForm(login_path, map, new OkManager.Fun4() {

@Override

public void onResponse(JSONObject jsonObject) {

Log.i(Tag, jsonObject.toString());

}

});

}

});

testButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

manager.asyncDownLoadImgtByUrl(img_path, new OkManager.Fun3() {

@Override

public void onResponse(Bitmap bitmap) {

// testImageView.setBackgroundResource(0);

testImageView.setImageBitmap(bitmap);

Log.i(Tag, "231541645");

}

});

}

});

}

}

六、运行结果:





七:客户端Android源码地址:https://github.com/HankZhaoSE/OkHttp3

服务器地址:https://github.com/HankZhaoSE/OkHttp3Server
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: