Android 使用OKhttp获取天气

1.1在build.gradle中引入okhttp依赖

implementation("com.squareup.okhttp3:okhttp:4.8.0")

1.2 在build.gradle中引入gson依赖

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

点击同步

1.3 Android studio插件下载(GsonFormat)

File >>  Settings  >>  Plugins

2.设置网络权限

 

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

3.新建一个工具类

3.在api.java中添加以下代码

package com.example.myapplication;
import android.util.Log;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class Api { //    在这个类里新建OKhttp单例对象
private static OkHttpClient client;
    public static Api api = new Api();
    public static Api config() {
        client = new OkHttpClient.Builder()
                .build();
        return api;
    }
//ApiCallback  这是一个回调接  //  final ApiCallback callback它在这个地方用了那个回调接口
    public  void getRequest(String url, final ApiCallback callback) {
        //1 构造Request
        Request.Builder builder = new Request.Builder();
        Request request=builder.get().url(url).build();
        //2 将Request封装为Call
        Call call = client.newCall(request);
        //3 执行Call
        //第五步发起请求
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("onFailure", e.getMessage());
                callback.onFailure(e);
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
//                这个是请求成功后返回的数据的方法
//                这个就是返回的数据 response
//                然后通过这句final String result = response.body().string();把他的返回数据体解析出来
                final String result = response.body().string();
//                通过这个我们刚才出创建的回调接口传出去  传到使用它的地方   比如现在我们要在mainactivity中使用一下他
                callback.onSuccess(result);
            }
        });
    }
}

选中ApiCallback,按 alt+enter 新增interface接口

 

4. URL地址是http开头的所以要求添加一个  禁用掉明文流量请求的检查

在res中新建一个xml文件

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

 

android:networkSecurityConfig="@xml/network_security_config"

 

5. 新建weather类

alt+s ,打开弹框,黏贴入接口返回的数据,format格式化数据,点击ok,自动生成代码

6.  在MainActivity.java里输入代码

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;

public class MainActivity extends AppCompatActivity {


    private TextView tvWeather;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//        TextView tvWeather = findViewById(R.id.tv_weather);
//        鼠标你点到tvWeather 上按ctrl+alt+f 这个快捷键可以生成全局变量  最后点击一下enter就可以了
        tvWeather = findViewById(R.id.tv_weather);
//       在这个地方创建一个方法 然后还是点击alt+enter 会自动提示问你是想要创建一个方法么
//       这个键就相当于一个帮助按钮吧,可以补全代码,方法,或者发生错误的时候给你一些提示信息
        init();
    }


    private void init() {
        //        在这里使用刚才创建的那个工具类里的方法
        Api.config().getRequest("http://wthrcdn.etouch.cn/weather_mini?citykey=101210101", new ApiCallback() {
            @Override
            public void onSuccess(String res) {
 //         成功的时候在这里可以写你想要的操作
//          res 这个就是获取到的result
//          现在解析数据   用Gson解析  引入一下他的依赖
                Log.e("onSuccess", res);
                Gson gson = new Gson();
                final Weather weather = gson.fromJson(res, Weather.class);
//                返回的数据中有一个 "status": 1000, 判断数据是否请求成功
                if (weather.getStatus() == 1000) {
                    Log.i("获取成功了", "onSuccess: "+weather.getData().getCity());
//                  因为okhttp获取数据是异步的所以是在子线程中进行的  但是UI操作只能在主线程中进行所以需要用runOnUiThread开一个线程进入到主线程中显示数据
                    Looper.prepare();
                    Toast.makeText(MainActivity.this, "获取信息成功", Toast.LENGTH_SHORT).show();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //tvWeather.setText("获取一下城市吧:"+weather.getData().getCity());
                            tvWeather.setText("获取一下城市吧:"+weather.getData().getForecast().get(4).getType());
                        }
                    });
                    Looper.loop();
                } else {
//                  这个也toast是要在主线程中
//                  用另一种方法写一下   给他开一个队列
                    Looper.prepare();
                    Toast.makeText(MainActivity.this, "获取信息失败", Toast.LENGTH_SHORT).show();
                    Looper.loop();
                }
            }
            @Override
            public void onFailure(Exception e) {
                Log.e("onFailure", e.getMessage());
                Looper.prepare();
                Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
                Looper.loop();
            }
        });
    }
    
}

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值