2015-03-25 52 views
0

我有一個消耗web服務的asynctask。現在我需要在一個小時內每天執行一次asynctask。 我想要做的是在AlarmManager中調用asynctask的doinbackground事件。我已閱讀關於使用AlarmManager的信息,但沒有關於在asynctask中使用它的文檔。 我該走向正確的方向嗎? 任何建議將高度apreciate如何在Alarmmanager內運行asynctask?

+0

爲什麼不使用[__IntentService__](http://developer.android.com/reference/android/app/IntentService.html)來執行WebService的工作,就像您每天在特定時間執行一次一樣。 – Bharatesh 2015-03-25 03:51:23

+0

正如bharat所說,你應該使用'IntentService'而不是'AsyncTask'。您需要創建一個鬧鐘,在需要的時間發送廣播。使用'BroadcastReceiver'來監聽廣播,然後讓它啓動'IntentService'。在互聯網上有很多代碼示例,在這裏也是堆棧溢出 - 只是做一些搜索。 – Squonk 2015-03-25 04:01:04

+0

@bharat我很困惑,爲什麼不使用asynctask,因爲文檔說它應該用於短操作,因爲調用web服務.. – montjoile 2015-03-25 04:56:47

回答

0

第1步:創建一個在一天運行一次的報警管理器。 您可以根據自己的要求設定時間。我在這裏設定在早上7點。

int REPEATING_TIME = 24 * 60 * 60 * 1000; 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.set(Calendar.HOUR_OF_DAY, 06); 
     calendar.set(Calendar.MINUTE, 59); 
     calendar.set(Calendar.SECOND, 59); 

     Intent i = new Intent(context, DemoService.class); 
     PendingIntent pi = PendingIntent.getService(context, 
       202, i, 
       PendingIntent.FLAG_CANCEL_CURRENT); 

     AlarmManager alarmManager = (AlarmManager) context 
       .getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
       calendar.getTimeInMillis(), REPEATING_TIME, pi); 

第2步:創建一個asynctask類並在那裏執行後臺操作。

public class LoadData extends AsyncTask<String, String, String>{ 

    @Override 
    protected String doInBackground(String... params) { 

     return "response"; 
    } 

} 

第3步:創建一個擴展服務的類。

public class DemoService extends Service { 

     @Override 
     public void onCreate() { 
      super.onCreate(); 

     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      new LoadData(){}protected void onPostExecute(String result){ 
// anything you want to perform onPost. 
};}.execute("API URL"); 

      stopSelf(); 
      return super.onStartCommand(intent, flags, startId); 
     } 

     @Override 
     public IBinder onBind(Intent intent) { 
      return null; 
     } 

    } 

希望它能解決您的問題。

+1

在'Service'中使用'AsyncTask'是無意義的練習,AsyncTask被設計爲與UI交互(而「Service」沒有UI)。簡單地使用一個'IntentService'來管理自己的工作線程,並在工作完成時關閉。 – Squonk 2015-03-25 04:03:19

+0

你的觀點是對的,但有時我們不需要執行與UI相關的任務。就像我們只是想更新數據庫等 – 2015-03-25 04:35:30