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开发学习笔记-实现联网检测程序版本的更多相关文章

  1. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

  2. android开发学习笔记系列(1)-android起航

    前言 在学习安卓的过程中,我觉得非常有必要将自己所学的东西进行整理,因为每每当我知道我应该是如何去实现功能的时候,有许多细节问题我总是会遗漏,因此我也萌生了写一系列博客来描述自己学习的路线,让我的an ...

  3. 【转】Android开发学习笔记(一)——初识Android

    对于一名程序员来说,“自顶向下”虽然是一种最普通不过的分析问题和解决问题的方式,但其却是简单且较为有效的一种.所以,将其应用到Android的学习中来,不至于将自己的冲动演变为一种盲目和不知所措. 根 ...

  4. Android开发学习笔记(二)——编译和运行原理(1)

    http://www.cnblogs.com/Pickuper/archive/2011/06/14/2078969.html 接着上一篇的内容,继续从全局了解Android.在清楚了Android的 ...

  5. android开发学习笔记系列(2)-android应用界面编程

    前言 本篇博客将会简要介绍andriod开发过程中的一些界面元素和编程的实现,我将大家走进安卓的XML世界,当然可能会涉及到java代码,当然本文主要是介绍XML文件的界面布局. 那么我们的XML存在 ...

  6. Android开发学习笔记DDMS的使用

    打开DDMS DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务. DDMS里面包含了:Device(设备) F ...

  7. 【转】Android开发学习笔记:5大布局方式详解

    Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...

  8. 【Android开发学习笔记之一】5大布局方式详解

    Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...

  9. 【Android开发学习笔记】【第九课】重力感应

    概念 使用重力感应技术的Android游戏已经屡见不鲜,不知道自己以后会不会用到,所以先研究了一下. 在网上学习了一下,貌似没有api,所以得自己去分析手机处在怎样状态下.注意: 下面提供的demo程 ...

随机推荐

  1. volatile关键字学习

    volatile关键字在实际工作中我用的比较少,可能因为我并不是造轮子的.但是用的少不是你不掌握的借口,还是要创造场景去使用这个关键字,本文将会提供丰富的demo. volatile 发音:英[ˈvɒ ...

  2. GODOT 3.0 开发进度汇报 #6

    经过了又一个月的开发工作,在此作进度报告.本月的工作可以划分为:完成Web导出工具开发.GDNative.以及新的粒子系统. Web Export Godot 现在有了一款实验性的导出工具,导出目标为 ...

  3. Android View.MeasureSpec

    有时,Android系统控件无法满足我们的需求,因此有必要自定义View. 一般来说,自定义控件都会去重写View的onMeasure方法,因为该方法指定该控件在屏幕上的大小,[protected v ...

  4. C/C++中的static关键字详解

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用.一.面向过程设计中的sta ...

  5. Telegraf+InfluxDB+Grafana快速搭建实时监控系统 监控postgresql

    Telegraf+InfluxDB+Grafana快速搭建实时监控系统  监控postgresql

  6. jQuery&CSS 顶部和底部固定浮动工具栏 兼容IE6

    http://www.cnblogs.com/lhj588/archive/2013/04/02/2994639.html —————————————————————————————————————— ...

  7. Linux 内核版本,Ubuntu版本的查看

    查看内核版本 1)  cat /proc/version [root@a ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@x ...

  8. Axiom3D:Ogre地形组件代码解析

    大致流程. 这里简单介绍下,Axiom中采用的Ogre的地形组件的一些概念与如何生成地形. 先说下大致流程,然后大家再往下看.(只说如何生成地形与LOD,除高度纹理图外别的纹理暂时不管.) 1.生成T ...

  9. VIM的自动补全

    自动补全可以很好的提高输入的效率: 触发自动补全的方法总结: 可供弹出式菜单的使用的命令: 其它再补充:

  10. JDBC驱动程序类型

    JDBC驱动程序是什么? JDBC驱动程序在JDBC API中实现定义的接口,用于与数据库服务器进行交互. 例如,使用JDBC驱动程序,可以通过发送SQL或数据库命令,然后使用Java接收结果来打开数 ...