Android Studio App开发之网络通信中使用POST方式调用HTTP接口实现应用更新功能(附源码 超详细必看)
运行有问题或需要源码请点赞关注收藏后评论区留言~~~
一、POST方式调用HTTP接口
POST方式把接口地址与请求报文分开,允许使用自定义的报文格式,由此扩大了该方式的应用场景。POST请求与GET请求主要有三处编码差异
1:在调用setRequestMethod方法时 请求方式填POST而非GET
2:POST方式务必调用setDoOutput方法并设置true,表示准备让连接执行输出操作
3:连接成功之后,要向连接对象的输出流写入请求报文的字节数据
接下来通过一个实例,演示如何在App开发中发送POST请求来更新应用版本。
此处要搭建HTTP服务器,过程省略不表,读者可自行上网查询
完成服务器搭建之后,通过电脑浏览器访问Web服务的默认首页,可以在命令行查找电脑的无线网址,如果能够正常打开网页,就表示在笔记本电脑上搭建好了HTTP服务器 效果如下
可自行在下拉框中选择要更新的应用
连接真机测试效果更好
代码如下
Java类
package com.example.chapter14;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;import com.example.chapter14.bean.PackageInfo;
import com.example.chapter14.constant.ApkConstant;
import com.example.chapter14.task.CheckUpdateTask;
import com.example.chapter14.task.req.CheckUpdateReq;
import com.example.chapter14.task.resp.CheckUpdateResp;
import com.google.gson.Gson;public class HttpPostActivity extends AppCompatActivity implements CheckUpdateTask.OnCheckUpdateListener {private static final String TAG = "HttpPostActivity";private Spinner sp_app_name; // 应用名称的下拉框private ImageView iv_app;private TextView tv_app_result;private boolean isFirstSelect = true; // 是否首次选择@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_http_post);iv_app = findViewById(R.id.iv_app);tv_app_result = findViewById(R.id.tv_app_result);initAppSpinner(); // 初始化应用名称的下拉框}// 初始化应用名称的下拉框private void initAppSpinner() {ArrayAdapter<String> apkNameAdapter = new ArrayAdapter<String>(this,R.layout.item_select, ApkConstant.NAME_ARRAY);sp_app_name = findViewById(R.id.sp_app_name);sp_app_name.setPrompt("请选择要更新的应用");sp_app_name.setAdapter(apkNameAdapter);sp_app_name.setOnItemSelectedListener(new AppNameSelectedListener());sp_app_name.setSelection(0);}class AppNameSelectedListener implements AdapterView.OnItemSelectedListener {public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {if (isFirstSelect) { // 刚打开页面时不需要执行下载动作isFirstSelect = false;return;}queryAppInfo(arg2); // 查询应用的详细信息}public void onNothingSelected(AdapterView<?> arg0) {}}// 查询应用的详细信息private void queryAppInfo(int pos) {iv_app.setImageResource(ApkConstant.ICON_ARRAY[pos]); // 设置图像视图的资源图片CheckUpdateReq req = new CheckUpdateReq(); // 创建检查更新的请求对象req.package_list.add(new PackageInfo(ApkConstant.PACKAGE_ARRAY[pos]));String content = new Gson().toJson(req); // 把检查更新的请求对象转换为json字符串CheckUpdateTask task = new CheckUpdateTask(); // 创建一个检查应用更新的异步任务task.setCheckUpdateListener(this); // 设置应用更新检查的监听器task.execute(content); // 把应用更新检查任务加入到处理队列}// 在结束应用更新检查时触发@Overridepublic void finishCheckUpdate(String resp) {if (TextUtils.isEmpty(resp)) {Toast.makeText(this, "应用检查更新失败", Toast.LENGTH_SHORT).show();return;}// 把JSON串转换为对应结构的实体对象CheckUpdateResp checkResp = new Gson().fromJson(resp, CheckUpdateResp.class);if (checkResp!=null && checkResp.package_list!=null && checkResp.package_list.size()>0) {PackageInfo info = checkResp.package_list.get(0);String desc = String.format("应用检查更新结果如下:\n应用名称:%s\n应用包名:%s\n最新版本:%s\n下载地址:%s",info.app_name, info.package_name, info.new_version, info.download_url);tv_app_result.setText(desc); // 显示当前选中应用的检查更新结果}}}
APK类
package com.example.chapter14.constant;import com.example.chapter14.R;public class ApkConstant {public static String[] NAME_ARRAY = {"爱奇艺", "酷狗音乐", "美图秀秀", "微信", "淘宝", "QQ"};public static String[] PACKAGE_ARRAY = {"com.qiyi.video", "com.kugou.android", "com.mt.mtxx.mtxx","com.tencent.mm", "com.taobao.taobao", "com.tencent.mobileqq"};public static int[] ICON_ARRAY = {R.drawable.icon_aiqiyi, R.drawable.icon_kugou, R.drawable.icon_meitu,R.drawable.icon_weixin, R.drawable.icon_taobao, R.drawable.icon_qq};public static String[] URL_ARRAY = {"https://3g.lenovomm.com/w3g/yydownload/com.qiyi.video/60020","https://3g.lenovomm.com/w3g/yydownload/com.kugou.android/60020","https://3g.lenovomm.com/w3g/yydownload/com.mt.mtxx.mtxx/60020","https://3g.lenovomm.com/w3g/yydownload/com.tencent.mm/60020","https://3g.lenovomm.com/w3g/yydownload/com.taobao.taobao/60020","https://3g.lenovomm.com/w3g/yydownload/com.tencent.mobileqq/60020"};}
bean类
package com.example.chapter14.bean;public class PackageInfo {public String app_name; // 应用名称public String package_name; // 应用包名public String download_url; // 下载地址public String new_version; // 新版本号public PackageInfo() {app_name = "";package_name = "";download_url = "";new_version = "";}public PackageInfo(String package_name) {this.package_name = package_name;}}
XML文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="5dp" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp" ><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="请选择要更新的应用:"android:textColor="@color/black"android:textSize="17sp" /><Spinnerandroid:id="@+id/sp_app_name"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:spinnerMode="dialog" /></LinearLayout><ImageViewandroid:id="@+id/iv_app"android:layout_width="match_parent"android:layout_height="50dp"android:scaleType="fitCenter" /><TextViewandroid:id="@+id/tv_app_result"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout>
创作不易 觉得有帮助请点赞关注收藏~~~
Android Studio App开发之网络通信中使用POST方式调用HTTP接口实现应用更新功能(附源码 超详细必看)相关推荐
- Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
运行有问题或需要源码请点赞关注收藏后评论区留言~~ 显示Intent和隐式Intent Intent是各个组件之间的信息沟通的桥梁,既能在Activity之间沟通,又能在Activity与Servi ...
- Android Studio App开发中高级控件下拉列表Spinner的讲解及实战(附源码 超详细必看)
运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.下拉框Spinner Spinner是下拉框控件,它用于从一串列表中选择某项,其功能类似于单选按钮的组合,下拉列表的展示方式有两种,一种是在当 ...
- 【Android App】物联网中指南针、计步器、感光器、陀螺仪的讲解及实战演示(附源码 超详细必看)
需要源码请点赞关注收藏后评论区留言~~~ 一.指南针-磁场传感器 顾名思义,指南针只要找到朝南的方向就好了. 可是在App中并非使用一个方向传感器这么简单,事实上单独的方向传感器已经弃用,取而代之的是 ...
- Android App开发实战项目之购物车(附源码 超详细必看)
需要源码请点赞关注收藏后评论区留言~~~ 一.需求描述 电商App的购物车可谓是司空见惯了,可以知道购物车除了底部有一个结算行,其余部分主要是已加入购物车的商品列表,然后每个商品左边是商品小图,右边是 ...
- 【Python自然语言处理】隐马尔可夫模型中维特比(Viterbi)算法解决商务选择问题实战(附源码 超详细必看)
需要源码请点赞关注收藏后评论区留言私信~~~ 一.统计分词 统计分词基本逻辑是把每个词语看做由单字组成,利用统计学原理计算连接字在不同文本中出现的次数,以此判断相连字属于特定词语的概率. 二.隐马尔可 ...
- Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
运行有问题或需要全部源码请点赞关注收藏后评论区留言~~~ 一.循环视图RecyclerView 尽管ListView和GridView分别实现了多行单列和多行多列的列表,使用也很简单,可是它们缺少变化 ...
- Android App开发动画特效之实现百叶窗动画和马赛克动画效果实战演示(附源码和演示视频 可直接使用)
需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.实现百叶窗动画 合理运用图层规则可以实现酷炫的动画效果,比如把图片分割成一条一条,接着每条都逐渐展开,这便产生了百叶窗动画,把图片等分为若干小方格 ...
- android:自己动手编译Android源码(超详细)
自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 4330 阅读 86819评论 89喜欢 339赞赏 7 在Android Studio代码调试一文中 ...
- C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码...
C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 原文:C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 前言 系列 ...
最新文章
- linux终端密码星星,如何在Ubuntu终端中显示密码星号
- NIX***检测方法
- PCRE函数简介和使用示例
- topcoder srm 711 div1 -3
- Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
- 深度学习框架Caffe, MXNet, TensorFlow, Torch, CNTK性能测试报告
- Java学习进阶—高级编程
- 万万没想到,AI算法开发、OCR应用已经进入零门槛时代!
- php方便,两个方便测试PHP特性的小程序
- mysql无法通过工具连接_MySQL 8.0版本无法使用 node、Navicat等三方工具连接的问题...
- oracle 10g下载百度云地址
- hive sql列转行
- 浅谈机器人比赛中的系统工程和组织管理
- 计算机组装硬件配置清单,组装电脑配置清单
- USB 3.0 对无线鼠标的干扰问题
- 傲梅备份服务器系统,傲梅轻松备份如何还原系统的详细解析
- 什么样的公司程序员待遇好?
- 什么是企业管理咨询服务?
- Polygon已在测试网中实现EIP-1559
- Bless You Autocorrect!(字典树上建图)