Android 网络通信

使用Github上开源库完成http通讯和json解析

一、准备工作

1、两个github上星标最多的库,可用于http通讯:
okhttp和retrofit
配置如下:

implementation 'com.squareup.retrofit2:retrofit:2.7.0'
implementation ("com.squareup.okhttp3:okhttp:4.2.2")

github上星标最多的http库
2、FastJson或Gson进行Json解析
Moudlebuild.gradle中添加:

FastJson

compile 'com.alibaba:fastjson:1.2.61'


Gson

implementation 'com.google.code.gson:gson:2.8.6'

3、使用阿里巴巴远程仓作为仓库添加
alibaba仓
替换projectbuild.gradle中的代码:

allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/public/' }
        mavenLocal()
        mavenCentral()
    }
}

4、建立一个本地的服务器
以Apache为例

二、建立工程

参考《第一行代码-Android》
1、配置Okhttp

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

2、在Manifest中注册

 <uses-permission android:name="android.permission.INTERNET"/>

3、MainActivity中代码

//在按钮事件中调用这个函数,并将结果显示到textview中
package edu.ujs.ac.httpjson;

import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.IOException;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {
    private static final int GET = 1;
    private Button mBtnSend;
    private TextView mTextResult;
    private String mStrUrl = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
    //private OkHttpClient client = new OkHttpClient();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtnSend = findViewById(R.id.button);
        mTextResult = findViewById(R.id.textView);
//        Request request = new Request.Builder()
//                .url("http://www.baidu.com")
//                .build();
        mBtnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //动作代码
                //sendRequestWithOkHttp();//不封装的Okhttp
                //sendRequestWithHttp();//自定义封装接口
                sendRequestWithOk();//封装的OkHttp
            }
        });
    }

    /**
     * 调用封装的Okhttp接口
     */
    private void sendRequestWithOk(){
       HttpUtil.sendOkHttpRequest(mStrUrl,new okhttp3.Callback(){

           @Override
           public void onResponse(Call call, Response response) throws IOException {
               String responseData = response.body().string();
               showResponse(responseData);
           }

           @Override
           public void onFailure(Call call, IOException e) {

           }
       });
    }


    /**
     * 调用封装的Http接口
     */
    private void sendRequestWithHttp(){
        HttpUtil.sendHttpRequest(mStrUrl, new HttpCallbackListener() {
            @Override
            public void onFinish(String response) {
                //
                showResponse(response);
            }

            @Override
            public void onError(Exception e) {

            }
        });
    }

    /**
     * 不封装的okHttp调用
     */
    private void sendRequestWithOkHttp(){
        new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder()
                            .url("http://www.kuaidi100.com/query?type=yuantong&postid=11111111111")
                            //.url(mStrUrl)
                            .build();
                    Response response = client.newCall(request).execute();
                    String responseData = response.body().string();
                    parseJSONWithGSON(responseData);
                    showResponse(responseData);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            }).start();
    }

    /**
     * 处理返回的json数据
     * @param jsonData
     */
    private void parseJSONWithGSON(String jsonData) {
        Gson gson = new Gson();
//        Trailer trailers = gson.fromJson(jsonData,Trailer.class);
//        List<Trailer.TrailersBean> trailerList = trailers.getTrailers();
//        Log.e("Main",""+trailerList.size());
//        for(Trailer.TrailersBean trailer : trailerList){
//            Log.e("Main","id is" +trailer.getMovieName());
//        }
        Express express = gson.fromJson(jsonData,Express.class);
        List<Express.DataBean> dataBeanList = express.getData();
        for(Express.DataBean data : dataBeanList){
            Log.e("main", "parseJSONWithGSON: "+data.getContext());
        }

        //Log.e("Main", "parseJSONWithGSON: "+express.getData().size() );
    }

    /**
     * 将返回的数据显示在textview中
     * @param response
     */
    private void showResponse(final String response){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mTextResult.setText(response);
            }
        });
    }
}

2、封装Http请求方法
这里封装了两种
一种是原生的http请求
另一种是okHttp方法

package edu.ujs.ac.httpjson;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import okhttp3.OkHttpClient;
import okhttp3.Request;

/**
 * Created by ancheng on 2019/12/19.
 */

public class HttpUtil {

    /**
     * 使用自定义的回调方法
     * @param address 地址
     * @param listener 回调
     */
    public static void sendHttpRequest(final String address,final HttpCallbackListener listener){
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                try{
                    URL url = new URL(address);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    connection.setDoInput(true);
                    connection.setDoOutput(true);
                    InputStream in = connection.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                    StringBuilder response = new StringBuilder();
                    String line;
                    while((line = reader.readLine())!=null){
                        response.append(line);
                    }
                    //return response.toString();
                    //回调方法
                    if(listener != null){
                        listener.onFinish(response.toString());
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    //return e.getMessage();
                    //回调方法
                    if(listener != null){
                        listener.onError(e);
                    }
                }finally {
                    if(connection!=null){
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }

    /**
     * 使用OkHttp的请求方法
     * @param address 地址
     * @param callback 回调
     */
    public static void sendOkHttpRequest(String address,okhttp3.Callback callback){
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(address)
                .build();
        client.newCall(request).enqueue(callback);
    }
    
    /**
     * 封装的okhttp的post方法,用于post带参数的请求。
     * @param url 请求地址
     * @param json json字段
     * @param callback 回调处理
     * @throws IOException
     */
    public static void okHttpPost(String url,String json,okhttp3.Callback callback) throws IOException {
        OkHttpClient client = new OkHttpClient();
        RequestBody body = RequestBody.create(JSON,json);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Call c = client.newCall(request);
        c.enqueue(callback);
    }
}

自定义回调接口

package edu.ujs.ac.httpjson;

/**
 * Created by ancheng on 2019/12/19.
 */

public interface HttpCallbackListener {
    void onFinish(String response);
    void onError(Exception e);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的网络通信可以使用Java中的标准网络API,如HttpURLConnection和HttpClient,也可以使用第三方库,如OkHttp和Volley。 使用HttpURLConnection进行网络通信的基本步骤如下: 1. 创建URL对象,指定要访问的URL地址。 2. 调用openConnection()方法,获取URLConnection对象。 3. 设置请求方法和请求头信息。 4. 发送请求,获取服务器响应。 5. 处理响应数据。 下面是一个使用HttpURLConnection进行GET请求的示例代码: ```java URL url = new URL("http://www.example.com/api/data"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); int responseCode = conn.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream inputStream = conn.getInputStream(); // 处理输入流中的数据 } else { // 处理错误响应 } conn.disconnect(); ``` 使用OkHttp进行网络通信的步骤也比较简单: 1. 创建OkHttpClient对象。 2. 创建Request对象,指定请求方法、请求URL和请求参数等信息。 3. 调用OkHttpClient对象的newCall方法创建Call对象,传入Request对象。 4. 调用Call对象的execute方法发送请求,获取服务器响应。 5. 处理响应数据。 下面是一个使用OkHttp进行GET请求的示例代码: ```java OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://www.example.com/api/data") .build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { ResponseBody responseBody = response.body(); // 处理响应体中的数据 } else { // 处理错误响应 } ``` 除了GET请求,还可以使用POST、PUT、DELETE等请求方法进行网络通信,具体使用方法可以参考相关文档或示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值