真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

andriod搭建輪詢框架的方法

小編給大家分享一下andriod搭建輪詢框架的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

公司主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)公司推出召陵免費(fèi)做網(wǎng)站回饋大家。

很多時(shí)候Android應(yīng)用需要每間隔一段時(shí)間向服務(wù)器請(qǐng)求數(shù)據(jù),如果服務(wù)器數(shù)據(jù)有更新則通知界面變化。Android中最常用的紅點(diǎn)一般采用的就是輪詢,紅點(diǎn)是為了在數(shù)據(jù)有更新時(shí)及時(shí)的提醒用戶,比如朋友圈更新,當(dāng)用戶的朋友圈更新時(shí)就會(huì)顯示紅點(diǎn),就是通過(guò)移動(dòng)端不斷的向服務(wù)器查詢朋友圈的更新?tīng)顟B(tài)。

相關(guān)知識(shí)點(diǎn)

在實(shí)現(xiàn)輪詢框架時(shí)會(huì)主要會(huì)要到下面兩個(gè)類,會(huì)結(jié)合輪詢框架對(duì)這三個(gè)類進(jìn)行講解,在應(yīng)用中分析會(huì)理解更加深刻。

1、IntentService IntentService是一種特殊的Service,繼承了Service并且是一個(gè)抽象類,必須創(chuàng)建它的子類才能用。IntentService可以用于執(zhí)行后臺(tái)耗時(shí)的任務(wù),當(dāng)任務(wù)執(zhí)行后會(huì)自動(dòng)停止,IntentService的優(yōu)先級(jí)比一般的線程高,比較適合執(zhí)行一些優(yōu)先級(jí)高的后臺(tái)任務(wù)。

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

輪詢框架實(shí)現(xiàn)

要實(shí)現(xiàn)輪詢,可以借鑒Handler中的looper機(jī)制,如下圖,維護(hù)一個(gè)消息隊(duì)列,循環(huán)的從消息隊(duì)列中取出消息來(lái)執(zhí)行,輪詢框架可以定時(shí)的向消息隊(duì)列中加入消息,然后循環(huán)中消息隊(duì)列中取出消息執(zhí)行。

andriod搭建輪詢框架的方法

可以自己實(shí)現(xiàn)一個(gè)Looper,但是IntentService中已經(jīng)包含了一個(gè)Looper和一個(gè)HandlerThread。因此輪詢框架中使用IntentService作為循環(huán)框架。繼承IntentService接口來(lái)實(shí)現(xiàn)處理消息訪問(wèn)服務(wù)器。

PollingService 用于每次輪詢時(shí)向請(qǐng)求服務(wù)器接口數(shù)據(jù)。

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();//這個(gè)是訪問(wèn)服務(wù)器獲取朋友圈是否更新
  }
 }
}

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

PollingUtil 用于控制輪詢服務(wù)的開(kāi)始和結(jié)束使用PollingUtil中的startPollingService來(lái)根據(jù)action和context生成一個(gè)PendingIntent,并將PendingIntent交給PollingScheduler來(lái)處理。PollingScheduler是一個(gè)線程池控制類。

public class PollingUtil {
 /**
  * 開(kāi)始輪詢服務(wù)
  */
 public static void startPollingService(final Context context, String action) {
   //包裝需要執(zhí)行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);
  }
 }
 /**
  * 停止輪詢服務(wù)
  *
  * @param context
  */
 public static void stopPollingServices(Context context, String action) {
   PollingScheduler.getInstance().clearScheduleTasks();
  }
 }

PollingScheduler實(shí)現(xiàn)定時(shí)向IntentService的Looper中加入消息PollingScheduler中生成一個(gè)單線程池,addScheduleTask中定時(shí)的執(zhí)行pendingIntent.send(),其中PendingIntent是由 PendingIntent pendingIntent = PendingIntent.getService(context, 0,intent, PendingIntent.FLAG_UPDATE_CURRENT); 生成的,pendingIntent.send()函數(shù)會(huì)調(diào)用Service.startService()來(lái)開(kāi)啟一個(gè)服務(wù)。

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();
 }
}

代碼分析

先給出類圖之間的關(guān)系如下:

andriod搭建輪詢框架的方法 

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

由于PendingIntent與PollingService關(guān)聯(lián),所以執(zhí)行pendingIntent.send()的時(shí)候會(huì)調(diào)用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()中有一個(gè) 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方法中生成了一個(gè)HandlerThread,一個(gè)mServiceLooper,一個(gè)mServiceHandler,其中mServiceHandler.sendMessage(msg)中的msg都會(huì)放到mServiceLooper,執(zhí)行時(shí)從mServiceLooper中取出執(zhí)行,其中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)中會(huì)調(diào)用onHandleIntent((Intent)msg.obj);方法,也就是在PollingService中重寫(xiě)的onHandleIntent方法。 因此我們?cè)赼ddScheduleTask中不斷的執(zhí)行pending.send()方法,會(huì)不斷的調(diào)用IntentService中的onStart方法中的mServiceHandler.sendMessage(msg);不斷的向消息隊(duì)列中發(fā)消息,然后在onHandleIntent處理消息。這樣一個(gè)輪詢框架就完成了。

以上是“andriod搭建輪詢框架的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


文章標(biāo)題:andriod搭建輪詢框架的方法
文章來(lái)源:http://weahome.cn/article/jedssi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部