亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

andriod如何搭建自己的輪詢框架

2019-10-21 21:30:58
字體:
來源:轉載
供稿:網友

很多時候Android應用需要每間隔一段時間向服務器請求數據,如果服務器數據有更新則通知界面變化。Android中最常用的紅點一般采用的就是輪詢,紅點是為了在數據有更新時及時的提醒用戶,比如朋友圈更新,當用戶的朋友圈更新時就會顯示紅點,就是通過移動端不斷的向服務器查詢朋友圈的更新狀態。

相關知識點

在實現輪詢框架時會主要會要到下面兩個類,會結合輪詢框架對這三個類進行講解,在應用中分析會理解更加深刻。

1、IntentService IntentService是一種特殊的Service,繼承了Service并且是一個抽象類,必須創建它的子類才能用。IntentService可以用于執行后臺耗時的任務,當任務執行后會自動停止,IntentService的優先級比一般的線程高,比較適合執行一些優先級高的后臺任務。

2、PendingIntent PendingIntent是延遲的intent,主要用來在某個事件完成后執行特定的Action。PendingIntent包含了Intent及Context,所以就算Intent所屬程序結束,PendingIntent依然有效,可以在其他程序中使用。PendingIntent一般作為參數傳給某個實例,在該實例完成某個操作后自動執行PendingIntent上的Action,也可以通過PendingIntent的send函數手動執行,并可以在send函數中設置OnFinished表示send成功后執行的動作。

輪詢框架實現

要實現輪詢,可以借鑒Handler中的looper機制,如下圖,維護一個消息隊列,循環的從消息隊列中取出消息來執行,輪詢框架可以定時的向消息隊列中加入消息,然后循環中消息隊列中取出消息執行。

 

 
andriod,輪詢框架

 

可以自己實現一個Looper,但是IntentService中已經包含了一個Looper和一個HandlerThread。因此輪詢框架中使用IntentService作為循環框架。繼承IntentService接口來實現處理消息訪問服務器。

PollingService 用于每次輪詢時向請求服務器接口數據。

public class PollingService extends IntentService {	public static final String ACTION_CHECK_CIRCLE_UPDATE="ACTION_CHECK_CIRCLE_UPDATE";		public static final long DEFAULT_MIN_POLLING_INTERVAL = 60000;//最短輪詢間隔1分鐘 public PollingService() {  super("PollingService"); }	 @Override protected void onHandleIntent(Intent intent) {  if (intent == null)   return;  final String action = intent.getAction();  if (ACTION_CHECK_Circle_UPDATE.equals(action)) {   CheckCircleOfFriendsUpdate();//這個是訪問服務器獲取朋友圈是否更新  } }}

PollingService 用來處理接到輪詢的消息之后在 onHandleIntent(Intent intent) 中根據Intent所帶有的action不同來進行訪問服務器不同的接口獲取數據。

PollingUtil 用于控制輪詢服務的開始和結束 使用PollingUtil中的startPollingService來根據action和context生成一個PendingIntent,并將PendingIntent交給PollingScheduler來處理。PollingScheduler是一個線程池控制類。

public class PollingUtil { /**  * 開始輪詢服務  */ public static void startPollingService(final Context context, String action) {   //包裝需要執行Service的Intent   Intent intent = new Intent(context, PollingService.class);   intent.setAction(action);   PendingIntent pendingIntent = PendingIntent.getService(context, 0,     intent, PendingIntent.FLAG_UPDATE_CURRENT);   PollingScheduler.getInstance().addScheduleTask(pendingIntent, 0, PollingService.DEFAULT_MIN_POLLING_INTERVAL);  } } /**  * 停止輪詢服務  *  * @param context  */ public static void stopPollingServices(Context context, String action) {   PollingScheduler.getInstance().clearScheduleTasks();  } }

PollingScheduler實現定時向IntentService的Looper中加入消息 PollingScheduler中生成一個單線程池,addScheduleTask中定時的執行pendingIntent.send(),其中PendingIntent是由 PendingIntent pendingIntent = PendingIntent.getService(context, 0,intent, PendingIntent.FLAG_UPDATE_CURRENT); 生成的,pendingIntent.send()函數會調用Service.startService()來開啟一個服務。

public class PollingScheduler { private static PollingScheduler sInstance; private ScheduledExecutorService mScheduler; private PollingScheduler() {  mScheduler = Executors.newSingleThreadScheduledExecutor(); } public static synchronized PollingScheduler getInstance() {  if (sInstance == null) {   sInstance = new PollingScheduler();  }  if (sInstance.mScheduler.isShutdown()) {   sInstance.mScheduler = Executors.newSingleThreadScheduledExecutor();  }  return sInstance; }	 public void addScheduleTask(final PendingIntent pendingIntent, long initialDelay, long period) {  Runnable command = new Runnable() {   @Override   public void run() {    try {     pendingIntent.send();    } catch (PendingIntent.CanceledException e) {     e.printStackTrace();    }   }  };  mScheduler.scheduleAtFixedRate(command, initialDelay, period, TimeUnit.MILLISECONDS); } public void clearScheduleTasks() {  mScheduler.shutdownNow(); }}

代碼分析

先給出類圖之間的關系如下:

andriod,輪詢框架

PollingService繼承了IntentService,并且在PollingUtil的startPollingService方法中通過 Intent intent = new Intent(context, PollingService.class); 和將PendingIntent 與PollingService關聯起來,并將PendingIntent加入到定時執行的線程池中,在PollingScheduler 中使用 pendingIntent.send();

由于PendingIntent與PollingService關聯,所以執行pendingIntent.send()的時候會調用PollingIntentServide中的onStart()方法。onStart()方法是IntentService中的方法,代碼如下:

 @Override public void onStart(@Nullable Intent intent, int startId) {  Message msg = mServiceHandler.obtainMessage();  msg.arg1 = startId;  msg.obj = intent;  mServiceHandler.sendMessage(msg); }

在onstart()中有一個 mServiceHandler.sendMessage(msg); ,找到mServiceHandler的生成位置:

 @Override public void onCreate() {  super.onCreate();  HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");  thread.start();  mServiceLooper = thread.getLooper();  mServiceHandler = new ServiceHandler(mServiceLooper); }

在IntentService的onCreate方法中生成了一個HandlerThread,一個mServiceLooper,一個mServiceHandler,其中mServiceHandler.sendMessage(msg)中的msg都會放到mServiceLooper,執行時從mServiceLooper中取出執行,其中ServiceHandler 的代碼如下

 private final class ServiceHandler extends Handler {  public ServiceHandler(Looper looper) {   super(looper);  }  @Override  public void handleMessage(Message msg) {   onHandleIntent((Intent)msg.obj);   stopSelf(msg.arg1);  } }

handleMessage(Message msg)中會調用onHandleIntent((Intent)msg.obj);方法,也就是在PollingService中重寫的onHandleIntent方法。 因此我們在addScheduleTask中不斷的執行pending.send()方法,會不斷的調用IntentService中的onStart方法中的mServiceHandler.sendMessage(msg);不斷的向消息隊列中發消息,然后在onHandleIntent處理消息。 這樣一個輪詢框架就完成了。

總結

本文的輪詢框架利用了IntentService中的handler和Looper機制來實現循環的處理消息,由于IntentService具有服務的特性因此特別適合后臺輪詢訪問服務器數據。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性欧美在线看片a免费观看| 成人av番号网| 在线播放日韩欧美| 久久久久中文字幕2018| 国产一区二中文字幕在线看| 另类专区欧美制服同性| 亚洲欧美综合区自拍另类| 992tv在线成人免费观看| 色哟哟入口国产精品| 欧美福利视频网站| 亚洲欧洲免费视频| 91精品在线观| 国产精品都在这里| 亚洲开心激情网| 久久99热精品这里久久精品| 亚洲第一色在线| 欧美午夜激情小视频| 亚洲日本中文字幕免费在线不卡| 91精品国产91久久久久久久久| 欧美日韩激情小视频| 91av视频在线| 亚洲第一中文字幕| 欧美黑人一区二区三区| 69精品小视频| 91亚洲精品视频| 亚洲精品午夜精品| 久久免费国产视频| 欧美老女人性视频| 555www成人网| 亚洲福利在线播放| 久久成人精品视频| 日本精品性网站在线观看| 国产精品专区一| 亚洲视频电影图片偷拍一区| 久久影视电视剧凤归四时歌| 国产v综合ⅴ日韩v欧美大片| 欧美一级bbbbb性bbbb喷潮片| 久久国内精品一国内精品| 国产成人精品国内自产拍免费看| 国产欧美日韩视频| 久久久久五月天| 亚洲欧美中文日韩在线| 亚洲人成五月天| 国产精品网站视频| 国产亚洲人成网站在线观看| 亚洲一区二区久久久久久久| 国产在线a不卡| 第一福利永久视频精品| 久久久亚洲欧洲日产国码aⅴ| 亚洲精品之草原avav久久| 久久久www成人免费精品张筱雨| 国产精品普通话| 久久免费成人精品视频| 亚洲欧美999| 中文字幕亚洲情99在线| 国内精品久久久久久久久| 91精品在线观看视频| 欧美性在线观看| 欧美重口另类videos人妖| 欧美视频在线观看免费网址| 久久国产精品影片| 欧美区在线播放| 日韩av毛片网| 亚洲人成电影网站色www| 国产精品jizz在线观看麻豆| 97免费在线视频| 国产精品福利久久久| 亚洲国产成人91精品| 日韩在线观看免费全| 亚洲裸体xxxx| 久久久久亚洲精品| 欧美成年人视频| 色综合久久中文字幕综合网小说| 久久国产天堂福利天堂| 国产精品久久999| 亚洲一区二区三区在线免费观看| 欧美三级欧美成人高清www| 亚洲欧洲一区二区三区久久| 亚洲国产精品资源| 日本乱人伦a精品| 日韩在线观看免费高清完整版| 国产亚洲精品美女久久久| 国产精品成人播放| 日韩电影在线观看中文字幕| 日韩一二三在线视频播| 日韩中文字幕第一页| 成人精品一区二区三区| 日本a级片电影一区二区| 欧美一区二区三区免费观看| 狠狠躁天天躁日日躁欧美| 91麻豆国产精品| 51视频国产精品一区二区| 色yeye香蕉凹凸一区二区av| 亚洲精品美女在线观看播放| 亚洲视频在线观看视频| 色综合久久精品亚洲国产| 成人日韩在线电影| 色综合视频一区中文字幕| 久久av.com| 亚洲欧美国产另类| 欧美电影在线观看| 国产成人精品av| 欧美精品一区在线播放| 国产精品美女久久久久av超清| 4438全国亚洲精品在线观看视频| 日韩中文字幕在线观看| 国产成人免费av| 精品五月天久久| 欧美大全免费观看电视剧大泉洋| 精品无人区太爽高潮在线播放| 高清欧美一区二区三区| 日韩在线免费视频观看| 国产精品一香蕉国产线看观看| 亚洲欧美中文日韩v在线观看| 欧美成aaa人片免费看| 精品五月天久久| 亚洲精选一区二区| 亚洲综合在线做性| 亚洲一区二区三区xxx视频| 久久人人爽国产| 久久综合色88| 国产免费一区二区三区在线能观看| 精品国产一区二区三区在线观看| 国产一区二区三区在线观看网站| 91在线观看欧美日韩| 成人久久一区二区三区| 欧美专区福利在线| 91最新在线免费观看| 久久九九免费视频| 啊v视频在线一区二区三区| 久久亚洲国产精品| 91国内产香蕉| 欧美成人免费观看| 国产激情视频一区| 国产精品久久久久免费a∨| 国产精品99免视看9| 日韩69视频在线观看| 不卡av电影院| 自拍偷拍亚洲一区| 97在线视频观看| 亚洲色图国产精品| 欧美日韩一二三四五区| 国产亚洲视频在线| 欧美成人精品三级在线观看| 日韩精品免费综合视频在线播放| 久久久国产在线视频| 亚洲国内高清视频| 亚洲精品视频中文字幕| 综合国产在线视频| 精品成人在线视频| 国产精品91一区| 精品视频在线播放色网色视频| 精品无人区太爽高潮在线播放| 高清一区二区三区日本久| 亚洲欧洲一区二区三区在线观看| 久久久精品欧美| 国产精品青青在线观看爽香蕉| 777777777亚洲妇女| 菠萝蜜影院一区二区免费| 午夜精品福利视频| 成人激情视频在线播放| 日韩欧美aⅴ综合网站发布| 亚洲新声在线观看| 国产免费观看久久黄|