Phonegap 安卓的自动升级与更新。当版本为4.0的时候

清单文件中:

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14"/>
View Code

js文件:

[{"verName":"xinjiangQJ","verCode":2}]
View Code

主窗口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);
    }
}
View Code

把http请求【HttpURLConnection conn = (HttpURLConnection) url_2.openConnection();】放到了主线程中来运行,

报错android.os.NetworkOnMainThreadException

直接翻译就是:网络工作在主线程中的异常;网上一查发现是android中规定网络请求等耗时操作是不允许在主线程中出现的,需要另起线程,线程若有数据需要与主线程交互就可以用handler来接收。

参考资料连接: http://my.eoe.cn/1222037/archive/21064.html

原文地址:https://www.cnblogs.com/Jokers/p/3543393.html