android sdk源码分析,Weex Android SDK源码分析之Module(stream)

  • Post author:
  • Post category:其他


前言

modlue怎么能少得了网络请求尼(-_-),本篇博文介绍下Weex Moudle中的stream使用与源码分析~

代码分析

sendHttp(params, callback) : 网络请求

weex code

Arguments

params(object): 请求参数.

method(string): 方法例如: GET, POST.

url(string): 请求url.

header(object): 请求头.

body(string): 请求body.

callback(function): A callback function whose argument is the response string of the request. Example var stream = require(‘@weex-module/stream’);

stream.sendHttp({ method: ‘GET’, url: ‘path/to/a/uri’, }, function(ret) { // TODO 成功回调 });

封装api utils

/** * Created by walid on 16/6/13. * params : {method:POST/GET,url:http://xxx,header:{key:value}, * body:{key:value}} */

var stream = require(‘@weex-module/stream’);

// 定义所需常量

var apiURL = {

baseXbUrl: ‘http://www.***.***’,

getData: ‘/v1/xxx/api1’

};

function requestGet(url, callback) {

stream.sendHttp({

method: ‘GET’,

url: apiURL.baseXbUrl + url

}, function(ret) {

var retdata = JSON.parse(ret);

callback(retdata);

});

}

function requestPost(url, callback) {

requestPostWithBody(url, null, callback);

}

function requestPostWithBody(url, body, callback) {

stream.sendHttp({

method: ‘POST’,

url: apiURL.baseXbUrl + url,

body: body

}, function(ret) {

var retdata = JSON.parse(ret);

callback(retdata);

});

}

// 导出 获取数据方法

exports.getData= function(callback) {

requestPostWithBody(apiURL.getData, {

“start”: start

}, callback);

};

android code

WXSDKEngine.registerModule(“stream”, WXStreamModule.class);

1、WXStreamModule

@WXModuleAnno

public void sendHttp(String params, String callback) {

// 获取请求数据

JSONObject paramsObj = JSON.parseObject(params);

String method = paramsObj.getString(“method”);

String url = paramsObj.getString(“url”);

JSONObject header = paramsObj.getJSONObject(“header”);

final String body = paramsObj.getString(“body”);

// 拼接请求

WXRequest wxRequest = new WXRequest();

wxRequest.method = method;

wxRequest.url = url;

wxRequest.body = body;

// 保存header到map

if (wxRequest.paramMap == null) {

wxRequest.paramMap = new HashMap();

}

if (header != null) {

for (String key : header.keySet()) {

wxRequest.paramMap.put(key, header.get(key));

}

}

// 调用httpadapter进行数据获取

if (mWXSDKInstance != null && mWXSDKInstance.getWXHttpAdapter() != null) {

mWXSDKInstance.getWXHttpAdapter().sendRequest(wxRequest,

new StreamHttpListener(mWXSDKInstance.getInstanceId(), callback));

}

}

private class StreamHttpListener implements IWXHttpAdapter.OnHttpListener {

private String mInstanceId;

private String mCallback;

private StreamHttpListener(String instanceId, String callbak) {

mInstanceId = instanceId;

mCallback = callbak;

}

@Override

public void onHttpStart() {}

@Override

public void onHttpUploadProgress(int uploadProgress) {}

@Override

public void onHttpResponseProgress(int responseProgress) {}

// 接受response数据

@Override

public void onHttpFinish(final WXResponse response) {

WXSDKManager.getInstance().postOnUiThread(new Runnable() {

@Override

public void run() {

WXBridgeManager.getInstance().callback(mInstanceId, mCallback,

(response == null || response.originalData == null) ? “{}” :

new String(response.originalData));

}

}, 0);

if (WXEnvironment.isApkDebugable()) {

response.originalData != null ? new String(response.originalData) :

“response data is NUll!”);

}

}

}

2、自定义httpadapter

/** * Author: walid * Date : 2016/6/13 16:00 */

public class XbHttpAdapter implements IWXHttpAdapter {

@Override

public void sendRequest(final WXRequest request, final OnHttpListener listener) {

if (listener != null) {

listener.onHttpStart();

}

Date data = new Date();

// 添加 header

request.paramMap.put(“device-id”, AuthUtil.getDeviceId());

request.paramMap.put(“app-time”, String.valueOf(data.getTime()));

request.paramMap.put(“app-minorid”, AuthUtil.getAppMinorId());

request.paramMap.put(“app-id”, AuthUtil.getAppId());

request.paramMap.put(“user-agent”, AuthUtil.getUserAgent());

// 发起请求

WXHttpManager.getInstance().execute(new Runnable() {

@Override

public void run() {

WXResponse response = new WXResponse();

try {

HttpURLConnection connection = openConnection(request, listener);

int responseCode = connection.getResponseCode();

response.statusCode = String.valueOf(responseCode);

if (responseCode == 200 || responseCode == 202) {

response.originalData =

readInputStream(connection.getInputStream(), listener).getBytes();

} else {

response.errorMsg = readInputStream(connection.getErrorStream(), listener);

}

if (listener != null) {

listener.onHttpFinish(response);

}

} catch (IOException e) {

e.printStackTrace();

response.errorCode = “-1”;

response.errorMsg = e.getMessage();

if (listener != null) {

listener.onHttpFinish(response);

}

}

}

});

}

private HttpURLConnection openConnection(WXRequest request, OnHttpListener listener)

throws IOException {

URL url = new URL(request.url);

HttpURLConnection connection = createConnection(url);

connection.setConnectTimeout(request.timeoutMs);

connection.setReadTimeout(request.timeoutMs);

connection.setUseCaches(false);

connection.setDoInput(true);

/* header */

if (request.paramMap != null) {

Set keySets = request.paramMap.keySet();

for (String key : keySets) {

connection.addRequestProperty(key, request.paramMap.get(key).toString());

}

}

/* method */

String method = request.method;

if (!TextUtils.isEmpty(method)) {

connection.setRequestMethod(method);

/* body */

if (method.equals(“POST”)) {

if (listener != null) {

listener.onHttpUploadProgress(0);

}

DataOutputStream out = new DataOutputStream(connection.getOutputStream());

out.write(request.body.getBytes());

out.close();

if (listener != null) {

listener.onHttpUploadProgress(100);

}

}

}

return connection;

}

// 读取数据

private String readInputStream(InputStream inputStream, OnHttpListener listener) {

StringBuilder builder = new StringBuilder();

try {

int fileLen = inputStream.available();

BufferedReader localBufferedReader =

new BufferedReader(new InputStreamReader(inputStream));

char[] data = new char[2048];

int len;

while ((len = localBufferedReader.read(data)) > 0) {

builder.append(data, 0, len);

if (listener != null && fileLen > 0) {

listener.onHttpResponseProgress((builder.length() / fileLen) * 100);

}

}

localBufferedReader.close();

try {

inputStream.close();

} catch (IOException e) {

WXLogUtils.e(“DefaultWXHttpAdapter: ” + WXLogUtils.getStackTrace(e));

}

} catch (IOException e) {

e.printStackTrace();

}

String result = String.valueOf(builder);

try {

JSONObject jsonObject = JSON.parseObject(result);

String data = jsonObject.getString(“data”);

Logger.d(“result = ” + jsonObject);

return String.valueOf(jsonObject);

} catch (Exception e) {

Logger.d(“result = ” + result);

return result;

}

}

protected HttpURLConnection createConnection(URL url) throws IOException {

return (HttpURLConnection) url.openConnection();

}

}

1、拦截到js代码中发送请求操作,组装数据;

2、调用httpadapter进行网络连接;

3、连接成功回调js callback返回数据;

4、刷新UI;