Android OKhttp + alibaba:fastjson 提交数据

详情参考我的另一篇文章第二部分,进入后点击如图目录方案二跳转

点击进入

在这里插入图片描述

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 
            }
        });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全面解读

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值