清单文件中:
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14"/>
js文件:
[{"verName":"xinjiangQJ","verCode":2}]
主窗口MainActivity中的代码:
package fx.qj.cn; import android.os.Bundle; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.Window; import android.widget.Toast; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.Log; import org.apache.cordova.*; public class MainActivity extends DroidGap { private long exitTime = 0; //自动检查更新开始 private String localApkName = "XJQJW。apk";//存在于本地的apk名字 private String packageName = "fx.qj.cn";//本应用包名,用于获取本地版本号 private int serverVersion = 0;//服务端版本号 private int localVersion = 0;//本地版本号 private ProgressDialog pBar = null;//“正在下载”对话框 @Override public void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); super.init(); android.webkit.WebSettings settings = super.appView.getSettings(); String appCachePath = this.getCacheDir().getAbsolutePath(); settings.setAppCachePath(appCachePath); settings.setAllowFileAccess(true); settings.setAppCacheEnabled(true); super.setIntegerProperty("splashscreen",R.drawable.startup_bg1); super.loadUrl("file:///android_asset/www/index.html",5000); checkUpdate();//自动检查更新 } //双击退出 @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { exit(); return false; } return super.onKeyDown(keyCode, event); } public void exit() { if ((System.currentTimeMillis() - exitTime) > 2000) { Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { finish(); System.exit(0); } } //自动更新 private void checkUpdate() { localVersion = getLocalVersion(); new Thread() { @Override public void run() { // TODO Auto-generated method stub super.run(); URL url_2; String str = ""; int apkVersion = 0; String apkPath = ""; try { String path=getResources().getString(R.string.url_server); url_2 = new URL(path); HttpURLConnection conn = (HttpURLConnection) url_2 .openConnection(); conn.setConnectTimeout(5000); InputStream is = conn.getInputStream(); byte[] json = new byte[1024]; is.read(json); str = new String(json, "utf-8"); JSONArray array = new JSONArray(str); JSONObject item = array.getJSONObject(0); apkVersion = item.getInt("verCode"); String apkpath=getResources().getString(R.string.url_server); apkPath = apkpath; } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } Bundle data = new Bundle(); data.putInt("apkVersion", apkVersion); data.putString("apkPath", apkPath); Message msg = new Message(); msg.what = 1; msg.setData(data); hander.sendMessage(msg); } }.start(); } private int getLocalVersion(){ int version=-1; try { version = this.getPackageManager().getPackageInfo(packageName, 0).versionCode; } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.e("TAG",e.getMessage()); } return version; } private Handler hander = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: Bundle b = msg.getData(); serverVersion = b.getInt("apkVersion"); final String apkPath = b.getString("apkPath"); Log.v("apkVersion", serverVersion+""); if(localVersion<serverVersion){ AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this); alert.setTitle("软件更新").setMessage("发现新版本,建议立即更新使用.").setPositiveButton("更新", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 确定更新 pBar = new ProgressDialog(MainActivity.this); pBar.setTitle("正在下载"); pBar.setMessage("请稍后。。。"); pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); String apkpath=getResources().getString(R.string.url_apk); downFile(apkpath); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); alert.create().show(); } break; } } }; public void downFile(final String url){ pBar.show(); new Thread(){ public void run(){ HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(url); HttpResponse response; System.out.println(url); try { response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); FileOutputStream fileOutputStream = null; if(is != null){ File file = new File(Environment.getExternalStorageDirectory(),localApkName); fileOutputStream = new FileOutputStream(file); byte[] b = new byte[1024]; int charb = -1; int count = 0; while((charb = is.read(b))!=-1){ fileOutputStream.write(b, 0, charb); count += charb; } } fileOutputStream.flush(); if(fileOutputStream!=null){ fileOutputStream.close(); } down(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start(); } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); pBar.cancel(); update(); } }; public void down(){ new Thread(){ public void run(){ Message message = handler.obtainMessage(); handler.sendMessage(message); } }.start(); } public void update(){ Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory(),localApkName)) , "application/vnd.android.package-archive"); startActivity(intent); } }
把http请求【HttpURLConnection conn = (HttpURLConnection) url_2.openConnection();】放到了主线程中来运行,
报错android.os.NetworkOnMainThreadException
直接翻译就是:网络工作在主线程中的异常;网上一查发现是android中规定网络请求等耗时操作是不允许在主线程中出现的,需要另起线程,线程若有数据需要与主线程交互就可以用handler来接收。
参考资料连接: http://my.eoe.cn/1222037/archive/21064.html