Android开发学习笔记-实现联网检测程序版本
package com.frank.mobilesafe; import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL; import javax.net.ssl.HttpsURLConnection; import org.apache.http.HttpClientConnection;
import org.apache.http.client.methods.HttpUriRequest;
import org.json.JSONObject; import com.frank.mobilesafe.utils.FileHelper; import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Window;
import android.widget.TextView;
import android.widget.Toast; public class SplashActivity extends Activity { private static final int SHOW_UPDATE_DIALOG = 0;
protected static final int REQUEST_FAILURE = 1;
protected static final int REQUEST_ERROR = 2;
private static final int SHOW_HOME = 3;
private Handler handler = new Handler() { @Override
public void handleMessage(Message msg) {
HandlerStartMessage(msg.what);
} }; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// requestWindowFeature(Window.FEATURE_NO_TITLE);设置无标题
setContentView(R.layout.activity_splash);
TextView tv_version = (TextView) findViewById(R.id.tv_version);
tv_version.setText(getVersion());
CheckUpdate();
} protected void HandlerStartMessage(int what) {
switch (what) {
case SHOW_UPDATE_DIALOG:
Toast.makeText(this, "该升级了", 0).show();
break;
case SHOW_HOME:
//Toast.makeText(this, "show home activity", 0).show();
ShowMainActivity();
break;
case REQUEST_FAILURE:
Toast.makeText(this, "REQUEST_FAILURE", 0).show();
break;
default:
break;
} }
/**
* 显示主界面
*/
private void ShowMainActivity() {
// TODO Auto-generated method stub
Intent intent = new Intent(this,MainActivity.class);
startActivity(intent);
finish(); } /**
* 检查升级
*/
protected void CheckUpdate() {
new Thread() {
public void run() {
long startTime = System.currentTimeMillis();
Message msg = Message.obtain();
try {
URL url = new URL("http://192.168.1.104/1.html");// 网络链接地址
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();// 创建连接对象
conn.setRequestMethod("GET");// 设置请求方式
conn.setReadTimeout(5000);// 设置请求超时时间 if (200 == conn.getResponseCode())// 当请成功的时候执行
{
InputStream inputStream = conn.getInputStream();
FileHelper helper = new FileHelper();
String content = helper.StreamToString(inputStream);
Log.i("a", content);
JSONObject obj = new JSONObject(content);
String version = (String) obj.get("version");
Log.i("version", version);
if (version == getVersion()) {
msg.what = SHOW_UPDATE_DIALOG;
}
else
{
msg.what = SHOW_HOME;
} } else {
Log.i("a", "请求失败!");
msg.what = REQUEST_FAILURE;
}
} catch (Exception e) {
Log.i("a", "shibai");
msg.what = REQUEST_ERROR;
e.printStackTrace();
} finally {
long endTime = System.currentTimeMillis();
long spanTime = endTime-startTime;
if (spanTime<2000) {
try {
Thread.sleep(2000-spanTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
handler.sendMessage(msg);
}
}; }.start(); } /**
* 获取版本信息
*
* @return
*/
protected String getVersion() {
String versionStr = "";
PackageManager packManger = getPackageManager();
try {
PackageInfo info = packManger.getPackageInfo(getPackageName(), 0);
versionStr = info.versionName;// 获取的版本信息
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
versionStr = "";
e.printStackTrace();
}
return versionStr; }
}
问题总结:
1、在解析JSON的时候需要情况一直遇到异常,出错异常信息为org.json.JSONException: Value ? of type java.lang.String cannot be converted to JSONObject,经查得是在保存json文本的时候是使用的记事本造成的,这也就是说在保存JSON的使用应该使用editplus等文本编辑器进行保存,保存的格式应该为utf8 无bom格式,这样在进行解析的时候就不会造成异常。
2、在联网获取数据的时候,因为是在本机iis上配置的站点,不过在请求数据的时候一直请求不到,遇到的第一个原因就是没有对请求设置请求方式以及请求时间,之后对百度等其他网站进行请求都没问题,却对自己配置的请求不了,经过抓耳挠腮之后,查的原因竟是http后面的反斜线少了一个。大意了!
3、在线程内访问线程外的资源的时候,需要使用java事件机制进行处理。主要方法如下:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
HandlerStartMessage(msg.what);
}
};
protected void CheckUpdate() {
new Thread() {
public void run() {
long startTime = System.currentTimeMillis();
Message msg = Message.obtain();
msg.what = SHOW_UPDATE_DIALOG;
handler.sendMessage(msg);
}
};
}.start();
Android开发学习笔记-实现联网检测程序版本的更多相关文章
- android开发学习笔记000
使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...
- android开发学习笔记系列(1)-android起航
前言 在学习安卓的过程中,我觉得非常有必要将自己所学的东西进行整理,因为每每当我知道我应该是如何去实现功能的时候,有许多细节问题我总是会遗漏,因此我也萌生了写一系列博客来描述自己学习的路线,让我的an ...
- 【转】Android开发学习笔记(一)——初识Android
对于一名程序员来说,“自顶向下”虽然是一种最普通不过的分析问题和解决问题的方式,但其却是简单且较为有效的一种.所以,将其应用到Android的学习中来,不至于将自己的冲动演变为一种盲目和不知所措. 根 ...
- Android开发学习笔记(二)——编译和运行原理(1)
http://www.cnblogs.com/Pickuper/archive/2011/06/14/2078969.html 接着上一篇的内容,继续从全局了解Android.在清楚了Android的 ...
- android开发学习笔记系列(2)-android应用界面编程
前言 本篇博客将会简要介绍andriod开发过程中的一些界面元素和编程的实现,我将大家走进安卓的XML世界,当然可能会涉及到java代码,当然本文主要是介绍XML文件的界面布局. 那么我们的XML存在 ...
- Android开发学习笔记DDMS的使用
打开DDMS DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务. DDMS里面包含了:Device(设备) F ...
- 【转】Android开发学习笔记:5大布局方式详解
Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...
- 【Android开发学习笔记之一】5大布局方式详解
Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...
- 【Android开发学习笔记】【第九课】重力感应
概念 使用重力感应技术的Android游戏已经屡见不鲜,不知道自己以后会不会用到,所以先研究了一下. 在网上学习了一下,貌似没有api,所以得自己去分析手机处在怎样状态下.注意: 下面提供的demo程 ...
随机推荐
- C语言 · 猜灯谜
标题:猜灯谜 A 村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字. 请你用计算机按小明的思路算一下,然后提交“请猜谜”三 ...
- TP v5中Url Compat模式
compatible 对于配置pathinfo的支持,在Nginx作服务器.无数种系统要同时运行的环境,实在是一项很累赘的事情,而又不想很low的多个参数(像m.c.a)构造路由参数,我需要那种不必强 ...
- CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解
CAS (5) -- Nginx代理模式下浏览器访问CAS服务器配置详解 tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 nginx版本: nginx-1.9.8 ...
- [开发笔记]-ASP.NET项目在IIS上使用虚拟目录
说一下我想要实现的效果: 假如我做一个图片展示类的网站,或者其他需要用户上传文件的网站,需要将用户上传的文件保存到一个Uploadfiles文件夹下,一般我们在做项目时用户上传的文件都是保存在网站项目 ...
- Java编程的逻辑 (47) - 堆和PriorityQueue的应用
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- 依赖注入:Ninject学习笔记
依赖注入(DI)就不多说了,可以自行百度,本笔记整理自Pro ASP.NET MVC5. 1,Ninject安装 Ninject是一个开源的注入容器,可以通过VS的Nuget进行安装.由于是在mvc中 ...
- .net dll类库 生成chm说明文档
效果图: 制作步骤: 1.下载Sandcastle http://shfb.codeplex.com/releases/view/105809 2.下载Html Help WorkShop http: ...
- Extjs4.x treegrid,check-tree,locked getChecked() 方法错误
当在treegrid中,锁定treecolumn列的时候,是无法通过执行getView().getChecked()获取选中的节点的,这是tree的一个bug, 详见:http://www.sench ...
- 【linux】——一个小程序
利用工作之余为小伙伴写了份作业,关于进程间通信的.题目如下: 父进程从键盘上接受1000个数据,对其求和sum1,子进程对这1000个数平方和sum2,结果传给父进程,父进程将sum1+sum2后,打 ...
- Linux 下安装 mysql
1. Mysql数据库的安装与初始化 1.1 Mysql安装 安装Mysql: $ cd /usr/local/ //查询出已安装的mariadb $ rpm -qa|grep mariad ...