1. 程式人生 > >2、更新提示

2、更新提示

在進入splash介面的時候後臺啟動執行緒,聯網檢查是否有更新版本可用,如果沒有新版本則splash介面顯示後進入主介面,否則顯示升級對話方塊讓使用者選擇是否進行更新。

1、許可權設定

因為需要聯網,所以AndroidManifest.xml檔案需要新增訪問網路的許可權:

<uses-permission android:name="android.permission.INTERNET" />
本人就是由於忘記新增該許可權,在後面的執行中出現錯誤:
12-23 03:24:26.999    1528-1541/com.example.mobilesafe W/System.err﹕ java.net.SocketException: socket failed: EACCES (Permission denied)
12-23 03:24:26.999    1528-1541/com.example.mobilesafe W/System.err﹕ at libcore.io.IoBridge.socket(IoBridge.java:576)
12-23 03:24:27.009    1528-1541/com.example.mobilesafe W/System.err﹕ at java.net.PlainSocketImpl.create(PlainSocketImpl.java:201)
12-23 03:24:27.009    1528-1541/com.example.mobilesafe W/System.err﹕ at java.net.Socket.checkOpenAndCreate(Socket.java:664)
12-23 03:24:27.009    1528-1541/com.example.mobilesafe W/System.err﹕ at java.net.Socket.connect(Socket.java:808)
12-23 03:24:27.009    1528-1541/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.Platform.connectSocket(Platform.java:131)
12-23 03:24:27.009    1528-1541/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.Connection.connect(Connection.java:101)
12-23 03:24:27.009    1528-1541/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)
12-23 03:24:27.019    1528-1541/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
12-23 03:24:27.019    1528-1541/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
12-23 03:24:27.029    1528-1541/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
12-23 03:24:27.029    1528-1541/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
12-23 03:24:27.029    1528-1541/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503)
12-23 03:24:27.029    1528-1541/com.example.mobilesafe W/System.err﹕ at com.example.mobilesafe.SplashActivity$checkUpdate.run(SplashActivity.java:146)
12-23 03:24:27.029    1528-1541/com.example.mobilesafe W/System.err﹕ at java.lang.Thread.run(Thread.java:841)
12-23 03:24:27.029    1528-1541/com.example.mobilesafe W/System.err﹕ Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied)
12-23 03:24:27.079    1528-1541/com.example.mobilesafe W/System.err﹕ at libcore.io.Posix.socket(Native Method)
12-23 03:24:27.079    1528-1541/com.example.mobilesafe W/System.err﹕ at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181)
12-23 03:24:27.079    1528-1541/com.example.mobilesafe W/System.err﹕ at libcore.io.IoBridge.socket(IoBridge.java:561)
12-23 03:24:27.079    1528-1541/com.example.mobilesafe W/System.err﹕ ... 13 more

2、伺服器更新配置

這裡使用wampserver搭建本地伺服器,更新配置檔案放在X:\wamp\www\app\mobilesafe目錄下,配置內容為:

<?xml version="1.0" encoding="utf-8"?>
<info>
    <ver>2.0</ver>
    <desc>親,有新版本了,趕緊更新吧!</desc>
    <apkurl>http://10.0.2.2/app/mobilesafe/mobilesafe.apk</apkurl>
 </info>
3、設定伺服器地址

因為伺服器地址屬於常量字串,這裡新增到strings.xml中:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">mobilesafe</string>
    <string name="serverurl">http://10.0.2.2/app/mobilesafe/update.xml</string>
</resources>

這裡是使用本機進行測試的,注意Android訪問本機的IP地址是:10.0.2.2,如果使用127.0.0.1會出現如下錯誤:
12-23 03:29:15.189    1573-1586/com.example.mobilesafe W/System.err﹕ java.net.ConnectException: failed to connect to /127.0.0.1 (port 80) after 5000ms: isConnected failed: ECONNREFUSED (Connection refused)
12-23 03:29:15.189    1573-1586/com.example.mobilesafe W/System.err﹕ at libcore.io.IoBridge.isConnected(IoBridge.java:223)
12-23 03:29:15.189    1573-1586/com.example.mobilesafe W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:161)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:112)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at java.net.Socket.connect(Socket.java:843)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.Platform.connectSocket(Platform.java:131)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.Connection.connect(Connection.java:101)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at com.example.mobilesafe.SplashActivity$checkUpdate.run(SplashActivity.java:146)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at java.lang.Thread.run(Thread.java:841)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ Caused by: libcore.io.ErrnoException: isConnected failed: ECONNREFUSED (Connection refused)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ at libcore.io.IoBridge.isConnected(IoBridge.java:208)
12-23 03:29:15.199    1573-1586/com.example.mobilesafe W/System.err﹕ ... 15 more

相關參考:http://www.myexception.cn/operating-system/754403.html

4、更新資訊結構體

按照伺服器更新配置,更新資訊共有三個欄位:版本號,更新提示文字,apk下載地址:

package com.example.mobilesafe;

/**
 * Created by sing on 13-12-23.
 */
public class UpdateInfo {
    //伺服器端版本號
    private String version;

    //伺服器端升級提示
    private String desc;

    //伺服器端apk下載地址
    private String apkurl;

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }
    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getApkurl() {
        return apkurl;
    }

    public void setApkurl(String apkurl) {
        this.apkurl = apkurl;
    }

}

5、XML更新配置解析類

注意XmlPullParser解析XML的nextText存在bug:

12-23 03:46:07.439    1729-1748/com.example.mobilesafe W/System.err﹕ org.xmlpull.v1.XmlPullParserException: END_TAG expected (position:START_TAG <version>@3:14 in [email protected])
12-23 03:46:07.449    1729-1748/com.example.mobilesafe W/System.err﹕ at org.kxml2.io.KXmlParser.nextText(KXmlParser.java:2077)
12-23 03:46:07.479    1729-1748/com.example.mobilesafe W/System.err﹕ at com.example.mobilesafe.UpdateInfoParser.getUpdateInfo(UpdateInfoParser.java:33)
12-23 03:46:07.479    1729-1748/com.example.mobilesafe W/System.err﹕ at com.example.mobilesafe.SplashActivity$checkUpdate.run(SplashActivity.java:153)
12-23 03:46:07.499    1729-1748/com.example.mobilesafe W/System.err﹕ at java.lang.Thread.run(Thread.java:841)

參考解決:http://blog.csdn.net/nxh_love/article/details/7109762,

這裡使用的方法是:當前的位置不是END_TAG時,在呼叫nextText()之後再呼叫nextTag(),完整程式碼:

package com.example.mobilesafe;

import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.InputStream;

/**
 * Created by sing on 13-12-23.
 */

public class UpdateInfoParser {
    /**
     *解析一個utf-8格式的xml輸入流,返回一個UpdateInfo物件
     * XmlPullParser解析bug參考解決:http://blog.csdn.net/nxh_love/article/details/7109762
     * @param is
     * @return UpdateInfo物件
     * @throws XmlPullParserException
     * @throws IOException
     */
    public static UpdateInfo getUpdateInfo(InputStream is) throws XmlPullParserException, IOException {
        UpdateInfo info = new UpdateInfo();

        //獲取一個pull解析的例項
        XmlPullParser parser = Xml.newPullParser();

        //解析xml
        parser.setInput(is, "UTF-8");
        parser.nextTag();
        int type = parser.getEventType();
        while (parser.nextTag() == XmlPullParser.START_TAG) {
            String tag = parser.getName();
            String text = parser.nextText();
            if (parser.getEventType() != XmlPullParser.END_TAG) {
                parser.nextTag();
            }
            if (tag.equals("ver")) {
                info.setVersion(text);
            } else if (tag.equals("desc")) {
                info.setDesc(text);
            } else if (tag.equals("apkurl")) {
                info.setApkurl(text);
            }
        }

        return info;
    }
}

6、SplashActivity::OnCreate建立檢查更新的執行緒

        //檢查更新
        new Thread(new checkUpdate()) {
        }.start();
    /**
     * 檢查更新
     */
    private class checkUpdate implements Runnable {
       public void run() {
           long startTime = System.currentTimeMillis();
           long endTime = startTime;
           Message msg = Message.obtain();
           try {
               //獲取伺服器更新地址
               String serverurl = getResources().getString(R.string.serverurl);
               URL url = new URL(serverurl);
               HttpURLConnection conn = (HttpURLConnection)url.openConnection();
               conn.setRequestMethod("GET");
               conn.setConnectTimeout(5000);
               int code = conn.getResponseCode();
               if (code == 200) {
                   //success
                   InputStream is = conn.getInputStream();
                    //解析出更新資訊
                   updateinfo = UpdateInfoParser.getUpdateInfo(is);
                   endTime = System.currentTimeMillis();
                   long time = endTime - startTime;
                   if (time < 2000) {
                       try {
                           Thread.sleep(2000 - time);
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                   }

                   msg.what = GET_INFO_SUCCESS;
                   handler.sendMessage(msg);
               } else {
                   //伺服器錯誤
                   msg.what = SERVER_ERROR;
                   handler.sendMessage(msg);
                   endTime = System.currentTimeMillis();
                   long time = endTime - startTime;
                   if (time < 2000) {
                       try {
                           Thread.sleep(2000 - time);
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                   }
               }

           } catch (MalformedURLException e) {
               msg.what = SERVER_URL_ERROR;
               handler.sendMessage(msg);
               e.printStackTrace();
           } catch (ProtocolException e) {
               msg.what = PROTOCOL_ERROR;
               handler.sendMessage(msg);
               e.printStackTrace();
           } catch (IOException e) {
               msg.what = IO_ERROR;
               handler.sendMessage(msg);
               e.printStackTrace();
           } catch (XmlPullParserException e) {
               msg.what = XML_PARSER_ERROR;
               handler.sendMessage(msg);
               e.printStackTrace();
           } catch (Exception e) {
               msg.what = UNKNOWN_ERROR;
               handler.sendMessage(msg);
               e.printStackTrace();
           }

       }
    }


7、新增訊息處理函式,在介面中統一顯示

   /**
     * 訊息處理器
     */
    private Handler handler = new Handler() {
         public void handleMessage(Message msg) {
            switch (msg.what) {
                case GET_INFO_SUCCESS:
                    String serverVersion = updateinfo.getVersion();
                    String currentVersion = getVersion();
                    if (currentVersion.equals(serverVersion)) {
                        Log.i(TAG, "版本號相同無需升級,直接進入主介面");
                    }else {
                        Log.i(TAG, "版本號不同需升級,顯示升級對話方塊");
                        showUpdateDialog();
                    }
                    break;
                case SERVER_ERROR:
                    Toast.makeText(getApplicationContext(), "伺服器內部異常", 1).show();
                    break;
                case SERVER_URL_ERROR:
                    Toast.makeText(getApplicationContext(), "伺服器路徑錯誤", 1).show();
                    break;
                case PROTOCOL_ERROR:
                    Toast.makeText(getApplicationContext(), "協議錯誤", 1).show();
                    break;
                case XML_PARSER_ERROR:
                    Toast.makeText(getApplicationContext(), "XML解析錯誤", 1).show();
                    break;
                case IO_ERROR:
                    Toast.makeText(getApplicationContext(), "I/O錯誤", 1).show();
                    break;
                case UNKNOWN_ERROR:
                    Toast.makeText(getApplicationContext(), "未知錯誤", 1).show();
                    break;
            }
        }
    };

8、當本地版本號與伺服器端獲取的版本號不同時提示升級對話方塊
/**
     * 顯示升級提示對話方塊
     */
    protected void showUpdateDialog() {
        //建立對話方塊構造器
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //設定對話方塊圖示
        builder.setIcon(getResources().getDrawable(R.drawable.notification));
        //設定對話方塊標題
        builder.setTitle("升級提示");
        //設定更新資訊為對話方塊提示內容
        builder.setMessage(updateinfo.getDesc());
        //設定升級按鈕及響應事件
        builder.setPositiveButton("升級", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        //設定取消按鈕及響應事件
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });

        //建立並顯示對話方塊
        builder.create().show();
    }

9、SplashActivity完整程式碼
package com.example.mobilesafe;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import android.os.Handler;

public class SplashActivity extends Activity {
    //常量定義
    public static final int UNKNOWN_ERROR = 99;
    public static final int GET_INFO_SUCCESS = 100;
    public static final int SERVER_ERROR = 101;
    public static final int SERVER_URL_ERROR = 102;
    public static final int PROTOCOL_ERROR = 103;
    public static final int IO_ERROR = 104;
    public static final int XML_PARSER_ERROR = 105;
    public static final String TAG = "SplashActivity";

    //獲取的伺服器端的更新資訊
    UpdateInfo updateinfo;

    //顯示版本號的tv控制元件
    private TextView tv_splash_version;

    //佈局控制元件
    private RelativeLayout r1_splash;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //設定無標題欄
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        //設定全屏模式
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //設定區域性,顯示版本號
        setContentView(R.layout.activity_splash);
        r1_splash = (RelativeLayout)findViewById(R.id.r1_splash);
        tv_splash_version = (TextView)findViewById(R.id.tv_splash_version);
        tv_splash_version.setText("版本號:" + getVersion());

        //顯示漸進動畫
        AlphaAnimation aa = new AlphaAnimation(0.3f, 1.0f);
        aa.setDuration(2000);
        r1_splash.startAnimation(aa);

        //檢查更新
        new Thread(new checkUpdate()) {
        }.start();
    }

    //獲取當前應用程式的版本號
    private String getVersion() {
        String version = "";

        //獲取系統包管理器
        PackageManager pm = this.getPackageManager();
        try {
            PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
            version = info.versionName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return version;
    }

    /**
     * 訊息處理器
     */
    private Handler handler = new Handler() {
         public void handleMessage(Message msg) {
            switch (msg.what) {
                case GET_INFO_SUCCESS:
                    String serverVersion = updateinfo.getVersion();
                    String currentVersion = getVersion();
                    if (currentVersion.equals(serverVersion)) {
                        Log.i(TAG, "版本號相同無需升級,直接進入主介面");
                    }else {
                        Log.i(TAG, "版本號不同需升級,顯示升級對話方塊");
                        showUpdateDialog();
                    }
                    break;
                case SERVER_ERROR:
                    Toast.makeText(getApplicationContext(), "伺服器內部異常", 1).show();
                    break;
                case SERVER_URL_ERROR:
                    Toast.makeText(getApplicationContext(), "伺服器路徑錯誤", 1).show();
                    break;
                case PROTOCOL_ERROR:
                    Toast.makeText(getApplicationContext(), "協議錯誤", 1).show();
                    break;
                case XML_PARSER_ERROR:
                    Toast.makeText(getApplicationContext(), "XML解析錯誤", 1).show();
                    break;
                case IO_ERROR:
                    Toast.makeText(getApplicationContext(), "I/O錯誤", 1).show();
                    break;
                case UNKNOWN_ERROR:
                    Toast.makeText(getApplicationContext(), "未知錯誤", 1).show();
                    break;
            }
        }
    };

    /**
     * 檢查更新
     */
    private class checkUpdate implements Runnable {
       public void run() {
           long startTime = System.currentTimeMillis();
           long endTime = startTime;
           Message msg = Message.obtain();
           try {
               //獲取伺服器更新地址
               String serverurl = getResources().getString(R.string.serverurl);
               URL url = new URL(serverurl);
               HttpURLConnection conn = (HttpURLConnection)url.openConnection();
               conn.setRequestMethod("GET");
               conn.setConnectTimeout(5000);
               int code = conn.getResponseCode();
               if (code == 200) {
                   //success
                   InputStream is = conn.getInputStream();
                    //解析出更新資訊
                   updateinfo = UpdateInfoParser.getUpdateInfo(is);
                   endTime = System.currentTimeMillis();
                   long time = endTime - startTime;
                   if (time < 2000) {
                       try {
                           Thread.sleep(2000 - time);
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                   }

                   msg.what = GET_INFO_SUCCESS;
                   handler.sendMessage(msg);
               } else {
                   //伺服器錯誤
                   msg.what = SERVER_ERROR;
                   handler.sendMessage(msg);
                   endTime = System.currentTimeMillis();
                   long time = endTime - startTime;
                   if (time < 2000) {
                       try {
                           Thread.sleep(2000 - time);
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                   }
               }

           } catch (MalformedURLException e) {
               msg.what = SERVER_URL_ERROR;
               handler.sendMessage(msg);
               e.printStackTrace();
           } catch (ProtocolException e) {
               msg.what = PROTOCOL_ERROR;
               handler.sendMessage(msg);
               e.printStackTrace();
           } catch (IOException e) {
               msg.what = IO_ERROR;
               handler.sendMessage(msg);
               e.printStackTrace();
           } catch (XmlPullParserException e) {
               msg.what = XML_PARSER_ERROR;
               handler.sendMessage(msg);
               e.printStackTrace();
           } catch (Exception e) {
               msg.what = UNKNOWN_ERROR;
               handler.sendMessage(msg);
               e.printStackTrace();
           }

       }
    }

    /**
     * 顯示升級提示對話方塊
     */
    protected void showUpdateDialog() {
        //建立對話方塊構造器
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //設定對話方塊圖示
        builder.setIcon(getResources().getDrawable(R.drawable.notification));
        //設定對話方塊標題
        builder.setTitle("升級提示");
        //設定更新資訊為對話方塊提示內容
        builder.setMessage(updateinfo.getDesc());
        //設定升級按鈕及響應事件
        builder.setPositiveButton("升級", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        //設定取消按鈕及響應事件
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });

        //建立並顯示對話方塊
        builder.create().show();
    }
}

10、執行效果圖

本地版本號與伺服器版本號相同時直接進入主介面:

12-23 05:43:33.279    2125-2125/com.example.mobilesafe I/SplashActivity﹕ 版本號相同無需升級,直接進入主介面

本地版本號與伺服器版本號不同時顯示提示升級對話方塊:

12-23 05:44:37.349    2125-2125/com.example.mobilesafe I/SplashActivity﹕ 版本號不同需升級,顯示升級對話方塊


相關推薦

2更新提示

在進入splash介面的時候後臺啟動執行緒,聯網檢查是否有更新版本可用,如果沒有新版本則splash介面顯示後進入主介面,否則顯示升級對話方塊讓使用者選擇是否進行更新。 1、許可權設定 因為需要聯網,所以AndroidManifest.xml檔案需要新增訪問網路的許可權:

EOSIO最新兩個版本1.1.51.2.0更新說明

EOSIO 1.1.5 發行說明 原文件參見:https://github.com/EOSIO/eos/releases/tag/v1.1.5 問題描述 修復net_plugin中未經檢查的CPU和記憶體增長(#5202) 當多個連線建立條目導致未經檢查儲存和處理增長時,net-pl

idea用Git如何拉取更新上傳提交專案(最新版idea2018.2.5版)超詳細超簡單版

這個idea啊~哎, 我是萬花叢中獨愛一支啊,雖然用的不順手,但是就是愛使。。。 這不,這兩天就遇見了個麻煩事,不會用Git拉專案、以及更新、還有提交專案。 注:本人使用的是最新版,要是其他的版本的不要驚慌~,基本上都一樣,沒有什麼太大的差別的,不要關頁面那麼快,親~

ubuntu WPS 提示“系統缺失字型symbolwingdingswingdings 2wingdings 3webding”的解決方法

啟動WPS for Linux後,出現提示"系統缺失字型" 。 出現提示的原因是因為WPS for Linux沒有自帶windows的字型,只要在Linux系統中載入字型即可。 具體操作步驟如下: 1. 下載缺失的字型檔案,然後複製到Linux系統中的/usr/share

【Redis】2CentOS 7 上安裝 redis3.2.3安裝與配置

sync 倉庫 ace /var/ 發現 wan sudo base str 一、redis源碼安裝 【更正】現在最新穩定的版本已經到了3.2.8 截至到2016.8.11,redis最新穩定版本為3.2.3.本篇文章我們就以此版本為基礎,進行相關的講解。 下載redis源

linux環境下部署zabbix3.2模板郵件告警詳細過程

-1 ice erer without zlib zip ever native item 服務端部署: 系統環境及軟件版本: Linux:release 6.3 zabbix:zabbix-3.2.5.tar.gz nginx:nginx-1.12.0.tar.gz ph

IC卡解密從零開始學2 版本更新! 解密工具PN532-mfoc-mfcuk-GUI V2.1 By:lookyour

由於 文件夾 7月 thread 2種 金融 系統 dos 同時 程序更新 更新內容最下面2017/5/3 V2.1======================================最簡要介紹下M1卡數據結構目前能看到的有2種M1卡,分別為S50 S70,其實就是

2歷史天氣首頁信息提取

result pan .get 我們 並不是 response img image 天氣 一、引言 上篇給大家介紹了Python爬蟲索要爬去的源網站及所需的軟件,本篇開始,將正式的開始爬取數據。 二、爬蟲利器 Beautiful Soup

Xcode7 運行iOS10以上系統(10.110.210.3)解決Could not find Developer Disk Image

ges 添加 -1 eve device images 真機 文件 eight 由於歷史原因,需要在Xcode7上真機運行下app,無奈手機系統已是10.3了,一運行, 就提示:Could not find Developer Disk Image 解決辦法: 1、找

全新的閃念膠囊,OneStep 1.5 以及 BigBang 2.0 更新後的 Smartisan OS 3.6 體驗

win .com googl 下午 老羅 free 好的 作者 沒有 本文標簽: OneStep1.5 BigBang2.0 SmartisanOS3.6 閃念膠囊 隨著堅果手機的發布,Smartisan OS 也得到了例行更新。包括了全新的閃念膠囊,OneStep 1.5

2CSS

leading 對齊方式 ora 版本 觸發 decimal 地址 list 單獨 一、CSS簡介 CSS 層疊樣式表,是對HTML進行樣式修飾語言 層疊:層層覆蓋疊加,如果不同的CSS樣式對同一HTML標簽進行修飾,樣式有沖突的部分應用優先級高的,不沖突的部分共同作用 樣

2samtools-faidx index

bsp 單位 區域 accep 計數 fff 相同 其他 gen 1、samtools faidx 1、samtools faidx 能夠對fasta 序列建立一個後綴為.fai 的文件,根據這個.fai 文件和原始的fasta文件, 能夠快速的提取任意區域的序列 2、用法

2深入學習基本結構——CNN

log eight ont idt title style wid adding boa 這節課主要簡單復習一下CNN從圖中例子,1、3共享參數,2、4共享。要看明白以上參數。後面就是舉例了。比如聲音信號下面是zero padding下面是pooling還可以有mass p

Redis系列--2Redis配置

redis配置詳解1、Redis配置在Redis有配置文件(redis.conf)可在Redis的根目錄下找到。可以通過Redis的CONFIG命令設置所有Redis的配置。2、配置文件說明:1. Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啟用守護進程 daemonize

王爽《匯編語言》第2版-----2寄存器

alt 第2版 mark fcm div clas 寄存器 ng- data- 王爽《匯編語言》第2版-----2、寄存器

數據結構(嚴蔚敏吳偉民)——讀書筆記-2 線性表及其基本運算順序存儲結構

content pri 線性 時間復雜度 length 將他 ron 個數 p s 第二章 線性表 2.1 線性表及其基本運算 2.2 線性表的順序存儲結構 2.3 線性表的鏈式存儲結構 1、線性表:是n個數據元素的有限序列。

通過Webstorm上傳代碼到Github更新代碼後同步到github及克隆github代碼到本地的方法

成了 ron 成功 commit 簡單 tps 命令行 是個 所有 導讀: Github做為IT愛好者分享代碼的一個知名的平臺,廣受大家喜歡,那麽我們平時該怎麽將自己寫的代碼上傳到github上面保存並且提供給其他人參考? 我想方法不外乎如下幾個: 1、直接在github網

centos7更新更新每天更新每天自動更新

ron 配置 .com crond load idt etc 狀態 con 每一天都有成千上萬的黑客在世界各地尋找 Linux 系統和常見軟件的安全漏洞,一有發現便會發動規模龐大而迅速的網絡攻擊,務求在我們來得及反應前把系統攻陷。不要以為黑客都只是十來歲的年輕小毛頭,大部分

mysql-插入更新刪除數據

sta row code ica update tab -- affect nbsp 1、插入: ① mysql中有三種插入:insert into、replace into、insert ignore insert into:表示插

Mysql數據庫理論基礎之七--插入刪除更新語句

插入、刪除、更新語句一、簡介由MySQL AB公司開發,是最流行的開放源碼SQL數據庫管理系統,主要特點:1、是一種數據庫管理系統2、是一種關聯數據庫管理系統3、是一種開放源碼軟件,且有大量可用的共享MySQL軟件4、MySQL數據庫服務器具有快速、可靠和易於使用的特點5、MySQL服務器工作在客戶端/服務器