详情参考我的另一篇文章第二部分,进入后点击如图目录方案二跳转
点击进入
OkHttp框架 + Gson + runOnUiThread
请求的数据接口较多时使用该方案会节省开发时间,线程更加安全
1引入依赖
implementation 'com.squareup.okhttp:okhttp:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.8'
implementation 'com.zhy:okhttputils:2.6.2'
implementation 'com.alibaba:fastjson:1.2.40'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
2用以解析Lsit的JsonStringUtil工具类
public class JsonStringUtil {
/**
* 转成list
*/
public static <T> ArrayList<T> stringToList(java.lang.String gsonString, Class<T> cls) {
Gson gson = new Gson();
ArrayList<T> list = new ArrayList<>();
JsonArray array = new
JsonParser().parse(gsonString).getAsJsonArray();
if (array != null) {
for (final JsonElement elem : array) {
list.add(gson.fromJson(elem, cls));
}
}
return list;
}
}
3 将OkHttp框架必要方法封装为工具类OkHttpUtil
public class OkHttpUtil {
private static final OkHttpClient client = new OkHttpClient();
public static final MediaType JSON = MediaType
.parse("application/json; charset=utf-8");
private static final MediaType MEDIA_TYPE_PNG = MediaType
.parse("image/png;charset=utf-8");
private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType
.parse("text/x-markdown; charset=utf-8");
static {
client.setConnectTimeout(30, TimeUnit.SECONDS);
}
/**
* 不会开启异步线程。
*
* @param request
* @return
* @throws IOException
*/
public static Response execute(Request request) throws IOException {
return client.newCall(request).execute();
}
/**
* 开启异步线程访问网络
*
* @param request
* @param responseCallback
*/
public static void enqueue(Request request, Callback responseCallback) {
client.newCall(request).enqueue(responseCallback);
}
/**
* 根据url地址获取数据
*
* @param url
* @return
* @throws IOException
*/
public static String doGetHttpRequest(String url) throws IOException {
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
return response.body().string();
}
/**
* 根据url地址和json数据获取数据
*
* @param url
* @param json
* @return
* @throws IOException
*/
public static String doPostHttpRequest(String url, String json,String apiSeq)
throws IOException {
Request request = new Request.Builder().url(url)
.addHeader("api_seq",apiSeq)
.post(RequestBody.create(JSON, json))
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
return response.body().string();
}
/**
* 根据url地址和json数据获取数据
*
* @param url
* @param json
* @return
* @throws IOException
*/
public static String doPostHttpRequest2(String url, String json)
throws IOException {
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, json);
Request request = new Request.Builder().url(url).post(body)
.addHeader("content-type", "application/json").build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
return response.body().string();
}
public static String doPostImgHttpRequest(String url, File file)
throws IOException {
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addFormDataPart("buffer", file.getName(),
RequestBody.create(MEDIA_TYPE_PNG, file)).build();
Request request = new Request.Builder().url(url).post(requestBody)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
return response.body().string();
}
}
4 使用案例
runOnUiThread是Activity自带的方法,点击了解更多
用以刷新UI
4.1 在Activity中结合runOnUiThread方法
public void getAlarmMusicListByNet() {
//获取服务端 音乐列表
//Uri url = Uri.parse(MultipleDeviceConstants.getUrlRegisterUser(jsonString));
new Thread(() -> {
try {
String responseString =
null;
responseString = OkHttpUtil.doPostHttpRequest(MultipleDeviceConstants.getUrlAlarmVoiceList(),"{}","300");
String finalResponseString = responseString;
runOnUiThread(()->{
List<String> musicList =
JsonStringUtil.stringToList(finalResponseString,
String.class);
for (String s:musicList){
alarmMusicAdapter.addItem(0,s);
}
//刷新音乐列表
alarmMusicAdapter.notifyDataSetChanged();
});
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
4.2 在Fragment中调用runOnUiThread
((MainActivity)getActivity()).runOnUiThread(new Runnable() {
@Override
public void run() {
//todo refresh ui
}
});