1 安装

  1. 安装android-studio,如android-studio-2020.3.1.26-windows.exe 1
  2. 安装SDK!建议找比较完整的SDK目录压缩包下载
  3. 第一步不装avd(andriod模拟器),下载雷电模拟器来替代
  4. 下载必要的依赖库okhttp-3.8.1.jar\okio-1.14.0.jar等(吐槽下JAVA这个服务器开发语言,居然没有好用的HTTP封装类,和C++没有标准的网络库一样,属实难崩)
  5. *安装postman等工具用于测试

2 配置

  1. 首先配置SDK目录:

image-20240306092330063

  1. 配置gradle(大坑一个,参考2

    1. step-1:修改hosts文件,附加:

      # dl.google.com fucking andriod
      58.254.149.225 dl.google.com
      220.181.174.97 dl.google.com
      180.163.151.161 dl.google.com
      220.181.174.33 dl.google.com
      58.254.137.161 dl.google.com
      203.208.39.193 dl.google.com
      
    2. step-2:创建 C:\Users\Liudx1985\.gradle\init.gradle

      allprojects{
          repositories {
              def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public'
              def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/public'
              def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
              def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin'
              all { ArtifactRepository repo ->
                  if(repo instanceof MavenArtifactRepository){
                      def url = repo.url.toString()
                      if (url.startsWith('https://repo1.maven.org/maven2/')) {
                          project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                          remove repo
                      }
                      if (url.startsWith('https://jcenter.bintray.com/')) {
                          project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                          remove repo
                      }
                      if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
                          project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
                          remove repo
                      }
                      if (url.startsWith('https://plugins.gradle.org/m2/')) {
                          project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
                          remove repo
                      }
                  }
              }
              maven { url ALIYUN_REPOSITORY_URL }
              maven { url ALIYUN_JCENTER_URL }
              maven { url ALIYUN_GOOGLE_URL }
              maven { url ALIYUN_GRADLE_PLUGIN_URL }
          }
      }
      

      如果gradle下载速度慢,可以修改工程根目录的/gradle/wrapper/gradle-wrapper.properties字段加速下载gradle-bin

      image-20240308115920730

      #distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
      distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-7.3.3-bin.zip
      
  2. 安装插件,如GsonFormatPlus(从JSON字符串自动生成Bean代码,方便后续解析json字符串)

    image-20240306093408456

    先用postman拿到http请求返回BODY里的JSON字符串

    在类名上右键→选GsonFormatPlus,粘贴上面的JSON字符串→Setting设置Gson→OK即可产生出代码

  3. 先进入雷电模拟器。新建一个测试andrio工程,选一个空activity,可以看到emulator-5554,运行app就可以在雷电模拟器看到程序自动运行了:

    image-0

    image-20240306095207385

3 开发代码

  1. 导入三方库:image-20240306095755500

    1. 有jar格式的,先复制粘贴到根目录下libs目录,然后在./build.gradle里面加入dependencies的 implementation(fileTree("libs"))
    2. 网络三方库,直接在上述的build.gradle里面使用包名字引入
    3. 点击右上角的sync!同步代码配置【重要】
  2. 增加andriod的网络权限 、.usesCleartextTraffic,供后续的HTTP请求使用image-20240306100223074

  3. 绑定各种android:id="@+id/welcome",为5做准备

    <TextView
     android:id="@+id/welcome"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
  4. +HttpUtil.java封装类

    package com.example.fuckandriod;
    import java.io.IOException;
    import okhttp3.Call;
    import okhttp3.Callback;
    import okhttp3.MediaType;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    
    public class HttpUtil {
        interface JsonHandler{ // 接口,用于HTTP返回数据的回调
            void handle(String body);
        }
    
        private static String token=""; // 
        static public void setToken(String t){ // 保存TOKEN,供后续自动设置HEADER['Authorization'] = TOKEN!
            token = t;
        }
    
        /***
         * Get request
         * @param url get URL
         * @param handler callback !
         */
        static public void get(String url, JsonHandler handler) {
            Request request = new Request.Builder()
                    .url(url)
                    .addHeader("Authorization", token) // 设置HEADER['Authorization'] = TOKEN!
                    .get()
                    .build();
            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .build();
            Call call = okHttpClient.newCall(request);
            call.enqueue(new Callback() {// 注意此处是异步的,也就是onResonpse内设置的成员&变量,要避免在外部直接使用
                @Override
                public void onFailure(Call call, IOException e) {
    
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    handler.handle(response.body().string());               
                }
            });
        }
    
        /***
         *
         * @param url url to post
         * @param data JSON string
         * @param handler handler callback
         */
        static public void post(String url, String data, JsonHandler handler) {
            MediaType JSON = MediaType.parse("application/json; charset=utf-8"); // Json数据 Type
            RequestBody body = RequestBody.create(JSON, data); // 转换字符串为JSON
            Request request = new Request.Builder()
                    .url(url)
                    .addHeader("Authorization", token)
                    .addHeader("Content-Type", "application/json;charset:utf-8")// post data format as JSON 
                    .post(body)
                    .build();
            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .build();
            Call call = okHttpClient.newCall(request);
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
    
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    handler.handle(response.body().string());
                }
            });
        }
    }
    
  5. 请求测试,注意这里面的beans类全部是用GsonFormatPlus插件生成!

    package com.example.fuckandriod;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    import androidx.appcompat.app.AppCompatActivity;
    import com.google.gson.Gson;
    
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            login();
        }
    
        private void getWeather() {    
    //        String url = "https://api.gumengya.com/Api/Weather?format=json&city=北京市&scene=1";
            String url = "http://10.199.1.96:8888/bs-weather-report/weather/area?area=北京市";
            HttpUtil.get(url, body -> {
                WeatherBean2 bean = new Gson().fromJson(body, WeatherBean2.class);
                runOnUiThread(() -> {
                    // set textview etc.
                    TextView tv_tem = findViewById(R.id.welcome);
                    tv_tem.setText("温度:" + bean.getData().getCurrentTemperature() + "°C");
                });
            });
        }
    
        private void login() {
            String jsonStr = "{\"username\":\"admin\",\"password\":\"admin123\"}"; // JSON 字符串!
            String url = "http://10.199.1.96:8888/login";
            HttpUtil.post(url, jsonStr, body -> {
                LoginBean bean = new Gson().fromJson(body, LoginBean.class);
                String token = bean.getToken();
                Log.d("GET-TOKEN: ", "login: token");
                HttpUtil.setToken(token);// 存储TOKEN后在发送GET 请求天气数据!
                getWeather(); // 注意此处是异步的,要避免在外部直接使用getWeather,不一定取到了token!!!
            });
        }
    }
    

    image-20240306104112846



  1. Android Studio最详细安装及使用教程 - 知乎 (zhihu.com) ↩︎

  2. Android Studio:Gradle、SDK配置全局代理 - 掘金 (juejin.cn) ↩︎