热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

用xutils3.0进行下载项目更新

这篇文章主要介绍了用xutils3.0进行下载项目更新的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

xUtils简介

xUtils 包含了很多实用的android工具。

xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...

xUitls 最低兼容android 2.2 (api level 8)

目前xUtils主要有四大模块:

DbUtils模块:

android中的orm框架,一行代码就可以进行增删改查;
支持事务,默认关闭;
可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);
支持绑定外键,保存实体时外键关联实体自动保存或更新;
自动加载外键关联实体,支持延时加载;
支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。

ViewUtils模块:

android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。

HttpUtils模块:

支持同步,异步方式的请求;
支持大文件上传,上传大文件不会oom;
支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求;
下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;
返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。

BitmapUtils模块:

加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
支持加载网络图片和本地图片;
内存管理使用lru算法,更好的管理bitmap内存;
可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等...

以上说这么多都是为下文做铺垫,下面步入主题:

写的例子比较简单,是用xutils3.0来进行下载项目更新

1.先通过网络请求,判断版本是否要更新

2.若要更新,则弹出一个弹窗,我用的是系统自带的Dialog,将下载的版本号及下载的内容提示展示出来

3.当用户点击下载时,开始下载,下载时展示一个水平的进度条

4.下载完成后,进度条消失,调用系统安装apk

如下是代码 用到的xutils的jar包是3.3.32版本的

package com.item.weixin;
import java.io.File;
import org.json.JSONException;
import org.json.JSONObject;
import org.xutils.x;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.Window;
import android.widget.Button;
/**
* 设置xutils下载
* 
* @author Administrator
* 
*/
public class LoginActivity extends Activity {
private Button ll_update;
private ProgressDialog pDialog;
private String nowVersion;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_login);
ll_update = (Button) findViewById(R.id.btn_login);
ll_update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
checkUpdate();
}
});
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(
getPackageName(), 0);
nowVersion = packageInfo.versionName;
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 下载更新,
*/
protected void checkUpdate() {
// TODO Auto-generated method stub
proDialogShow(LoginActivity.this, "正在查询...");
RequestParams params = new RequestParams("url");
x.http().get(params, new Callback.CommonCallback() {
@Override
public void onCancelled(CancelledException arg0) {
// TODO Auto-generated method stub
}
@Override
public void onError(Throwable arg0, boolean arg1) {
// TODO Auto-generated method stub
PDialogHide();
System.out.println("提示网络错误");
}
@Override
public void onFinished() {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(String arg0) {
// TODO Auto-generated method stub
PDialogHide();
try {
JSONObject object = new JSONObject(arg0);
boolean success = object.getBoolean("succee");
if (success) {
String desc = object.getString("desc");
String downloadurl = object.getString("downloadurl");
String versiOnname= object.getString("versionname");
if (nowVersion.equals(versionname)) {
System.out.println("当前版本为最新,不用跟新");
} else {
// 不同,弹出更新提示对话框
setUpDialog(versionname, downloadurl, desc);
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
/**
* 
* @param versionname
* 地址中版本的名字
* @param downloadurl
* 下载包的地址
* @param desc
* 版本的描述
*/
protected void setUpDialog(String versionname, final String downloadurl,
String desc) {
// TODO Auto-generated method stub
AlertDialog dialog = new AlertDialog.Builder(this).setCancelable(false)
.setTitle("下载" + versionname + "版本").setMessage(desc)
.setNegativeButton("取消", null)
.setPositiveButton("下载", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
setDownLoad(downloadurl);
}
}).create();
dialog.show();
}
/**
* 下载包
* 
* @param downloadurl
* 下载的url
* 
*/
@SuppressLint("SdCardPath")
protected void setDownLoad(String downloadurl) {
// TODO Auto-generated method stub
RequestParams params = new RequestParams(downloadurl);
params.setAutoRename(true);//断点下载
params.setSaveFilePath("/mnt/sdcard/demo.apk");
x.http().get(params, new Callback.ProgressCallback() {
@Override
public void onCancelled(CancelledException arg0) {
// TODO Auto-generated method stub
}
@Override
public void onError(Throwable arg0, boolean arg1) {
// TODO Auto-generated method stub
if(progressDialog!=null && progressDialog.isShowing()){
progressDialog.dismiss();
}
System.out.println("提示更新失败");
}
@Override
public void onFinished() {
// TODO Auto-generated method stub
}
@Override
public void onSuccess(File arg0) {
// TODO Auto-generated method stub
if(progressDialog!=null && progressDialog.isShowing()){
progressDialog.dismiss();
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(new File(Environment
.getExternalStorageDirectory(), "demo.apk")),
"application/vnd.android.package-archive");
startActivity(intent);
}
@Override
public void onLoading(long arg0, long arg1, boolean arg2) {
// TODO Auto-generated method stub
progressDialog.setMax((int)arg0);
progressDialog.setProgress((int)arg1);
}
@Override
public void onStarted() {
// TODO Auto-generated method stub
System.out.println("开始下载");
progressDialog = new ProgressDialog(LoginActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置为水平进行条
progressDialog.setMessage("正在下载中...");
progressDialog.setProgress(0);
progressDialog.show();
}
@Override
public void onWaiting() {
// TODO Auto-generated method stub
}
});
}
private void proDialogShow(Context context, String msg) {
pDialog = new ProgressDialog(context);
pDialog.setMessage(msg);
// pDialog.setCancelable(false);
pDialog.show();
}
private void PDialogHide() {
try {
if (pDialog != null && pDialog.isShowing()) {
pDialog.dismiss();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

以上所述是小编给大家介绍的用xutils3.0进行下载项目更新,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
author-avatar
woooooso_776
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有