1. 程式人生 > >【android學習】斷線重連機制

【android學習】斷線重連機制

【解決問題】

android端連線網路之後,當網路斷開連線時,為了提高使用者體驗,android自動檢測網路,當有網路時,使用者無需進行多餘操作,android端自動重新連線網路。

【解決方案】

1、設定網路斷開連線標誌:NET_BAD

1)每次傳送資料,若傳送資料不成功,檢測網路狀態,若斷開則置網路狀態為NET_BAD

2)若手機網路關閉,則置網路狀態為NET_BAD

如果網路未連線,做網路斷開處理:

1)通知主執行緒,彈出對話方塊表示網路斷開連線,提醒使用者。

2)重新連線網路,儲存使用者資訊,若網路連線成功,則將使用者資訊重新發送給伺服器。

2、檢測裝置網路是否開啟;

呼叫:DeviceNetUtil.isConnected(mContext)方法,返回true表示網路開啟,返回false則置網路狀態為NET_BAD

或者伺服器斷開也是網路斷開,置網路狀態為NET_BAD



import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.support.v4.net.ConnectivityManagerCompat;

public class DeviceNetUtil {
	private DeviceNetUtil() {
	}

	/**
	 * 檢查當前WIFI是否連線,兩層意思——是否連線,連線是不是WIFI
	 * 
	 * @param context
	 * @return true表示當前網路處於連線狀態,且是WIFI,否則返回false
	 */
	public static boolean isWifiConnected(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = cm.getActiveNetworkInfo();
		if (info != null && info.isConnected() && ConnectivityManager.TYPE_WIFI == info.getType()) {
			return true;
		}
		return false;
	}

	/**
	 * 檢查當前GPRS是否連線,兩層意思——是否連線,連線是不是GPRS
	 * 
	 * @param context
	 * @return true表示當前網路處於連線狀態,且是GPRS,否則返回false
	 */
	public static boolean isGprsConnected(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = cm.getActiveNetworkInfo();
		if (info != null && info.isConnected() && ConnectivityManager.TYPE_MOBILE == info.getType()) {
			return true;
		}
		return false;
	}

	/**
	 * 檢查當前是否連線
	 * 
	 * @param context
	 * @return true表示當前網路處於連線狀態,否則返回false
	 */
	public static boolean isConnected(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = cm.getActiveNetworkInfo();
		if (info != null && info.isConnected()) {
			return true;
		}
		return false;
	}

	/**
	 * 對大資料傳輸時,需要呼叫該方法做出判斷,如果流量敏感,應該提示使用者
	 * 
	 * @param context
	 * @return true表示流量敏感,false表示不敏感
	 */
	public static boolean isActiveNetworkMetered(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		return ConnectivityManagerCompat.isActiveNetworkMetered(cm);
	}

	public static Intent registerReceiver(Context context, ConnectivityChangeReceiver receiver) {
		return context.registerReceiver(receiver, ConnectivityChangeReceiver.FILTER);
	}

	public static void unregisterReceiver(Context context, ConnectivityChangeReceiver receiver) {
		context.unregisterReceiver(receiver);
	}

	public static abstract class ConnectivityChangeReceiver extends BroadcastReceiver {

		public static final IntentFilter FILTER = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);

		@Override
		public final void onReceive(Context context, Intent intent) {

			try {
				ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
				NetworkInfo wifiInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
				NetworkInfo gprsInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

				// 判斷是否是Connected事件
				boolean wifiConnected = false;
				boolean gprsConnected = false;
				if (wifiInfo != null && wifiInfo.isConnected()) {
					wifiConnected = true;
				}
				if (gprsInfo != null && gprsInfo.isConnected()) {
					gprsConnected = true;
				}
				if (wifiConnected || gprsConnected) {
					onConnected();
					return;
				}

				// 判斷是否是Disconnected事件,注意:處於中間狀態的事件不上報給應用!上報會影響體驗
				boolean wifiDisconnected = false;
				boolean gprsDisconnected = false;
				if (wifiInfo == null || wifiInfo != null && wifiInfo.getState() == State.DISCONNECTED) {
					wifiDisconnected = true;
				}
				if (gprsInfo == null || gprsInfo != null && gprsInfo.getState() == State.DISCONNECTED) {
					gprsDisconnected = true;
				}
				if (wifiDisconnected && gprsDisconnected) {
					onDisconnected();
					return;
				}
			} catch (Exception e) {

				LogUtil.i("error", "DeviceNetUtil ConnectivityChangeReceiver->onReceive->" + e.getMessage());
			}
		}

		protected abstract void onDisconnected();

		protected abstract void onConnected();
	}
}

3、為了保持客戶端和伺服器同步線上,建立心跳更新機制。

即隔一會兒,互相傳送資料,若長時間未接收到資料,判定為對方掉線或斷開連線。

相關推薦

android學習機制

【解決問題】 android端連線網路之後,當網路斷開連線時,為了提高使用者體驗,android自動檢測網路,當有網路時,使用者無需進行多餘操作,android端自動重新連線網路。 【解決方案】 1、設定網路斷開連線標誌:NET_BAD 1)每次傳送資料,若傳送資料不成功,

ActiveMQ的機制

primary active 節點 語法 無限 機制 新的 bubuko 獲取 斷線重連機制是ActiveMQ的高可用性具體體現之一。ActiveMQ提供failover機制去實現斷線重連的高可用性,可以使得連接斷開之後,不斷的重試連接到一個或多個brokerURL。 默認

即時通訊判斷網路狀態和機制

本文借鑑csdn大神way的xmpp客戶端學習改造而來,不足之處希望大家多多指教!  1. 由於近半年來一直寫針對於tigase伺服器的即時通訊軟體的開發,框架的重構,對即時通訊的理解也較之前更進一步,在客戶端的IM開發中,最重要的除去通訊的建立,就是保持網路環境不斷更換時

Mina 機制

Mina 斷線重連     定義:這裡討論的Mina 斷線重連是指使用mina作為客戶端軟體,連線其他提供Socket通訊服務的伺服器端。Socket伺服器可以是Mina提供的伺服器,也可以是C++提供的伺服器。      一、斷線重連的方式;     1.

UE4 第12講 FSocket

(版權宣告,禁止轉載) 【第03講】 實現了FSocket的連網基礎功能,這一講實現一下 斷線重連 <如果資深前輩發現有理解錯誤,還請不吝指正> <1> 建立Socket,設定阻塞模式(預設創建出來的就是阻塞模式,不用設定)  

Esp8266 進階之路26高階篇RTOS移植分析 MQTT 實現過程,實現移植 MQTT協議在 esp8266 rtos實時系統,可。(附帶Demo)

一、前言; esp8266的實時系統rtos是後面才出來支援的,其最後的呼叫也是呼叫樂鑫提供的API介面,所以,如果你已經玩轉了NONOS下的程式設計,那麼移植rtos程式碼是非常迅捷的,因為你已經對其的API介面非常熟悉,當然了

android 實現mqtt訊息推送,以及不停的問題解決

前段時間專案用到mqtt的訊息推送,整理一下程式碼,程式碼的原型是網上找的,具體哪個地址已經忘記了。 程式碼的實現是新建了一個MyMqttService,全部功能都在裡面實現,包括連伺服器,斷線重連,訂閱訊息,處理訊息,釋出訊息等基本操作。 首先新增依賴: dependencies { &

Android Socket連線(模擬心跳包,,傳送資料等)

這兩天做了一個專案是app通過socket連線自動炒菜機,給炒菜機發指令,炒菜機接收到指令會執行相應的操作。(程式雖然做的差不多了,然而我連炒菜機長什麼樣都沒見過) 其實作為一個會做飯的程式猿,我堅信還是自己動手做的飯菜比較好吃,畢竟做飯還是很有趣的。 閒話不

nodejs中mysql

調試 狀態 pan var 參考 ble prot nec clas 之前寫了個小程序Node News,用到了MySQL數據庫,在本地測試均沒神馬問題。放上服務器運行一段時間後,偶然發現打開頁面的時候頁面一直處於等待狀態,直到Nginx返回超時錯誤。於是上服務器檢查了遍,

django的資料庫

django每次查詢都會被把連線關閉,想保持長連線方法如下: from django.core import signals from django.db import close_connection # 取消訊號關聯,實現資料庫長連線 signals.request

teamtalk socket問題的查詢

之前從teamtalk的核心庫裡面剝離出一個跨平臺網路庫,一開始用的好好的,可是在某些地方使用的時候總是出怪問題,有時候斷線重連就一直連不上,導致應用失聯,在實際使用場景中一直出問題,好不尷尬。 經過連三天的苦思冥想,除錯程式碼看輸出終於有些眉目了。 我是從以下幾個方面著手解決的,特此記錄一

關於資料庫的一點點思考

最近在寫資料庫連結池,一個不可逃避的問題就是資料庫斷線重連。 查了很多資料,因為公司有很多專案用了 TP5 於是也去看了它的原始碼。 tp5的實現其實很簡單,配置了一些資料庫連線相關的錯誤資訊關鍵詞(句),然後在執行語句時 catch 異常資訊進行比對: // 伺服器斷線標識字元 p

Yii2實現mysql[轉載]

最近遇到“Yii2實現mysql斷線重連”問題,找了好久資料,最後找到這篇文件是說明了該情況的,感謝這位作者的分享,記錄下來,必備以後查閱。 原文連結:https://www.yiichina.com/topic/7296 Yii2實現資料庫斷線重連 一、前話 在工作中,有時候一

netty4.0 心跳檢測與操作

因為最近專案最近要用netty,服務端放在雲端,客戶端發在內網。那如何實現netty長連線和斷線重連呢(網路故障或者其他原因,客戶端要無限取重連服務端)。接下來我們看一下如何實現這個兩個功能呢。 服務端程式碼如下: package com.example.nettydem

Android學習第一章 · 安卓專案目錄結構

src: java原始碼所在目錄 gen:自動生成的資源id(不能修改) Android.jar:匯入安卓jar包才能使用安卓的api Android dependencies:映象,類似於快捷方式,原始檔在libs下 libs:支援包,使低版本支援高版本新特

mqtt協議 springboot2.0.4 mqttv3 釋出訂閱程式碼呼叫,mqtt

mqttv3 釋出訂閱程式碼呼叫 我用的是springboot2.0.4 直接上程式碼: pom.xml <dependency> <groupId>org.eclipse.paho</groupId>

iOS MQTT使用案例 ()

iOS MQTT使用案例 (斷線重連) 參考了 iOS MQTT—-MQTTClient實戰-看這篇的就夠了 大神寫的這篇 git: MQTT-Client-Framework 介紹啥的看百度,上面大神寫的就行了,直接上乾貨。 安裝: pod 'MQTTClient'

Android學習第三章 · 儲存容量的獲取&xml格式文字的建立與解析

相對佈局:結合RelativeLayout九宮格     表格佈局和絕對佈局不常用,瞭解就好   谷歌替代system.out.println()用Log.v(d<i<w<e)(tag,”文字資訊”)   設定

Node.js連線RabbitMQ,,動態繫結routing key

RabbitMQ官方提供的教程https://www.rabbitmq.com/tuto...,是基於回撥的。 下面將給出基於Promise式的寫法。並且實現動態的佇列繫結 初始化配置 const amqp = require('amqplib') // rabbitMQ地址 const {amqpA

WebSocket在服務端和客戶端通訊demo,支援心跳檢測+

一、為什麼需要 WebSocket? 初次接觸 WebSocket 的人,都會問同樣的問題:我們已經有了 HTTP 協議,為什麼還需要另一個協議?它能帶來什麼好處? 答案很簡單,因為 HTTP 協議有一個缺陷:通訊只能由客戶端發起。 舉例來說,我們想了解今天的天氣,只能是客戶端向伺服器發出