1. 程式人生 > >android 應用在網路非常差的情況下的處理

android 應用在網路非常差的情況下的處理

app在無網路情況下非常好判斷,

但是當網路很差,但是又有連結就不好辦了。

使用的retrofit+rxJava,自定義了一個subscribe就可以很好的處理網路差的情況

public class MySubscrible<T> extends Subscriber<HttpResult<T>>  {

    private MySubscribleListener<HttpResult<T>> listener;
    private Context mContext;
//    private Intent intent;
RefreshTask refreshTask
; private Timer timer; public MySubscrible(Context mContext, MySubscribleListener<HttpResult<T>> listener) { this.listener = listener; this.mContext = mContext; refreshTask = new RefreshTask(); // NetWorkManarge.getInstance().registerListtener(this); } @Override
public void onStart() { super.onStart(); if (timer == null) { timer = new Timer(); timer.scheduleAtFixedRate(refreshTask, 0L, (long) 1000); } // intent = new Intent(mContext, NetWorkService.class); // mContext.startService(intent); } @Override public void onCompleted
() { listener.onComplete(); if(timer != null){ timer.cancel(); timer = null; } Log.i("NetworkSpeedService", "end network test"); } @Override public void onError(Throwable e) { LogP.d(e.getMessage()); if (e instanceof SocketTimeoutException) { Toast.makeText(mContext, "網路請求超時,請重試", Toast.LENGTH_SHORT).show(); } else if (e instanceof ConnectException) { Toast.makeText(mContext, "網路中斷,請檢查您的網路狀態", Toast.LENGTH_SHORT).show(); } else if (e instanceof NullPointerException) { if (listener != null) Toast.makeText(mContext, "錯誤,請重試", Toast.LENGTH_SHORT).show(); // Toast.makeText(mContext, "error:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } else if (e instanceof HttpException) { Toast.makeText(mContext, "網路中斷,請檢查您的網路狀態", Toast.LENGTH_SHORT).show(); } else if (e instanceof MyNetWorkSlowException) { listener.onNetWorkSlow(); }else if (e instanceof UnknownHostException) { Toast.makeText(mContext, "網路錯誤,請檢查您的網路後重試", Toast.LENGTH_SHORT).show(); } else { // Toast.makeText(mContext, "error:" + e.getMessage(), Toast.LENGTH_SHORT).show(); Toast.makeText(mContext, "系統錯誤,請重試", Toast.LENGTH_SHORT).show(); } this.onCompleted(); } @Override public void onNext(HttpResult<T> httpResult) { listener.onNext(httpResult); } public void onNetWorkSlow() { this.onError(new MyNetWorkSlowException("networkslow")); this.unsubscribe(); } class RefreshTask extends TimerTask { boolean isFirst = true; private Handler handler = new Handler(); private long rxtxTotal = 0; private boolean isNetBad = false; private int time; private double rxtxSpeed = 1.0f; private DecimalFormat showFloatFormat = new DecimalFormat("0.00"); @Override public void run() { isNetBad = false; long tempSum = TrafficStats.getTotalRxBytes() + TrafficStats.getTotalTxBytes(); if (isFirst) { rxtxTotal = tempSum; isFirst = false; } long rxtxLast = tempSum - rxtxTotal; double tempSpeed = rxtxLast * 1000 / 1000; rxtxTotal = tempSum; if ((tempSpeed / 1024d) < 20 && (rxtxSpeed / 1024d) < 20) { time += 1; } else { time = 0; } rxtxSpeed = tempSpeed; Log.d("NetworkSpeedService", showFloatFormat.format(tempSpeed / 1024d) + "kb/s"); if (time >= 16) {//連續16次檢測網速都小於20kb/s 斷定網速很差. isNetBad = true; Log.d("NetworkSpeedService", "網速差 " + isNetBad); time = 0; //重新檢測 } if (isNetBad) { handler.post(new Runnable() { @Override public void run() { // receiverIntent.putExtra("is_slow_net_speed", isNetBad); // sendBroadcast(receiverIntent); // NetWorkService.this.stopSelf(); // NetWorkManarge.getInstance().notifyLoginData(); MySubscrible.this.onNetWorkSlow(); } }); } } } }
借鑑:https://www.jianshu.com/p/5678264e82d5

相關推薦

android 應用網路非常情況處理

app在無網路情況下非常好判斷,但是當網路很差,但是又有連結就不好辦了。使用的retrofit+rxJava,自定義了一個subscribe就可以很好的處理網路差的情況public class MySubscrible<T> extends Subscriber&

C#-搶紅包功能的分散式情況處理多併發

需求 需求經理設計了一個分享出去後,可以在微信群中搶優惠的活動。 簡單來說,就是每個參與活動的商品可以生成一個紅包池,分享到群裡後,可以像搶紅包一樣,去搶優惠金額。 問題 介面很快就根據需求設計開發出來了,並完善了相關活動規則。 但是多併發情況下,分享出去的紅

Android中Wifi未開啟情況獲取Mac地址

原來以為沒有開啟wifi功能是不能夠獲取wifi網絡卡mac地址的,在真機測試後發現能夠獲取到Mac地址只是獲取的ip為0,當然wifi未連線狀態下是肯定沒有IP分配的。具體看看下面: AndroidManifest.xml程式碼: 1  Java程式碼   <

Android應用在不同版本間相容性處理

       在Android系統中向下相容性比較差,但是一個應用APP經過處理還是可以在各個版本間執行的。向下相容性不好,不同版本的系統其API版本也不同,自然有些介面也不同,新的平臺不能使用舊的A

Charles抓取iOS/Android應用網路封包

最近在進行一些iOS網路、多執行緒的開發與學習,需要用到一些網路上的資料。自己搭建伺服器,寫介面,顯然成本太高。 而Charles輕鬆解決了這個問題。 Charles通常用來抓取本地的網路封包,但是當需要時,也可以用它來抓取其它裝置上的網路請求。 下面以i

centos在沒有網路連線的情況安裝rpm包

因為沒有網路連線,所以yum使用不了,這是我在手動安裝時遇到的一些問題及其解決辦法 一. 首先想到的方法應該是掛載centos ios映象,因為裡面的packages有本版本的所有rpm包,最好是本機安裝的映象。步驟如下: 1、先把光碟掛上 mount  -o loo

測試Nginx 和 Tomcat 高併發情況處理靜態頁面的效能

以下是 ab 壓力測試的結果(為了得到比較科學的資料可以進行多次的測試,一般至少10次) ab 可執行檔案的位置 /usr/local/web/apache/bin 測試命令:ab -n1000

分治策略(最情況查詢為線性時間演算法)

#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; /********************************************************

chrome瀏覽器字型顏色太淺或者模糊的情況處理方法

*{font-weight:100!important;} *{text-shadow:0 0 1.5px #ccc !important;} *:not([cla

android之webview無網路情況簡單處理

android的webview是如何使用的網路上一搜索就是一大頁面的資料。通常我們通過webview來訪問web頁面都是在網路的情況下,一旦沒有網路就會顯示"無法找到該網頁"的資訊,這樣會暴露我們的連線,所以我們需要一個有好的提示,並且不會暴露連結的方法。這時候WebVie

android webview無網路情況處理

import com.yck.utils.diy.LoadingDialog; import com.yck.utils.net.HttpUrl; import com.yck.utils.tools.MyLog; import android.content.Dialo

命令行Android應用開發

連接 pac project p s -1 str ldp 變量 -i 本文介紹怎樣創建你的第一個Android應用程序。您將學到怎樣創建一個Androidproject和執行可調試版本號的應用程序。 開始本文學習之前。確保你已經安裝了開發環境。你須要: 1、下載A

Android應用開發技術:基礎構建】命令行Android應用開發

star andro all class文件 abs 2.3 pil data 資源 作者:郭孝星 微博:郭孝星的新浪微博 郵箱:[email protected]/* */ 博客:http://blog.csdn.net/allenw

Android應用開發按返回鍵退向後臺執行

processor itl and task 微博 tracking blog 返回 class 轉載請註明來源:http://blog.csdn.net/kj

SYSAUX表空間占用過大情況處理(AWR信息過多)

AWR真題1、 SYSTEM和SYSAUX表空間存儲的內容有哪些區別?若SYSAUX表空間占用過大則應該如何處理?答案:在一般情況下,企業產生的業務數據應該存放在單獨的數據表空間,而不應該使用系統已存在的表空間,尤其不能將業務數據保存到SYSTEM和SYSAUX表空間中,所以,DBA需要著重關註SYSTEM

Window和Mac端口占用情況處理方式

mage use -a ask 處理 str klist listen 保留 1. 在Mac下端口占用的情況: 找到占用的進程並殺掉: 1.查看端口占用進程 sudo lsof -i :8880 可以看到進程的PID 2.殺掉進程 sudo kill -9 4580(

Android 讀寫權限,已經授權情況,仍然(Permission denied)

app sse 授權 權限設置 mission 重新 oid process 打開 首次安裝APP,獲取讀寫權限以後, 當讀取文件時候,仍然會遇見(Permission denied)錯誤,解決方案是殺掉APP,重新打開APP即可。 應該屬於部分版本系統的bug,直到A

怎樣用電腦連結別人的無線網路(沒有密碼的情況,生活艱苦,被逼無奈)

你是否有電腦沒網用又不知道附近無線網密碼的時候(我就有這種情況),下面我就分享一下一個簡單快捷的方法。   *************************************************************************************

Python(1)-在沒有網路情況pip超時無法下載包時解決包的安裝

在安裝python環境以及python的一些模組時,可能需要在沒有網的windows環境下安裝Python模組。 python模組下載地址,幾乎所有的模組都有:https://www.lfd.uci.edu/~gohlke/pythonlibs/ 在上面的網頁中搜索,會發現很多版本字尾為.whl的模組,

socket心跳超時檢測,快速處理新思路(適用於超大量TCP連線情況

假設一種情景:TCP伺服器有1萬個客戶端連線,如果客戶端5秒鐘不發資料,則要斷開。服務端如何檢測客戶端是否超時?這看起來是一個非常簡單的問題,其實不然! 最簡單的處理方法是:啟動一個執行緒,每隔一段時間,檢查每個連線是否超時。每次處理需要1萬次檢查。計算量太大!檢查的時間間隔不能太小,否則大大增