Andriod开发从入门到放弃
1 安装
- 安装android-studio,如android-studio-2020.3.1.26-windows.exe 1
- 安装SDK!建议找比较完整的SDK目录压缩包下载
- 第一步不装avd(andriod模拟器),下载雷电模拟器来替代
- 下载必要的依赖库okhttp-3.8.1.jar\okio-1.14.0.jar等(吐槽下JAVA这个服务器开发语言,居然没有好用的HTTP封装类,和C++没有标准的网络库一样,属实难崩)
- *安装postman等工具用于测试
2 配置
- 首先配置SDK目录:
-
配置gradle(大坑一个,参考2)
-
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
-
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
#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
-
-
安装插件,如GsonFormatPlus(从JSON字符串自动生成Bean代码,方便后续解析json字符串)
先用postman拿到http请求返回BODY里的JSON字符串
在类名上右键→选GsonFormatPlus,粘贴上面的JSON字符串→Setting设置Gson→OK即可产生出代码
-
先进入雷电模拟器。新建一个测试andrio工程,选一个空activity,可以看到
emulator-5554
,运行app就可以在雷电模拟器看到程序自动运行了:
3 开发代码
-
导入三方库:
- 有jar格式的,先复制粘贴到根目录下libs目录,然后在./build.gradle里面加入dependencies的
implementation(fileTree("libs"))
- 网络三方库,直接在上述的
build.gradle
里面使用包名字引入 - 点击右上角的sync!同步代码配置【重要】
- 有jar格式的,先复制粘贴到根目录下libs目录,然后在./build.gradle里面加入dependencies的
-
增加andriod的网络权限 、.usesCleartextTraffic,供后续的HTTP请求使用
-
绑定各种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" />
-
+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()); } }); } }
-
请求测试,注意这里面的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!!! }); } }