我讀過http://developer.android.com/guide/topics/appwidgets/index.html和http://www.vogella.com/tutorials/AndroidWidgets/article.html數據,尤其是第8節教程:通過服務設計模式加載耗時
更新組件,但是,仍然無法找到一個合適的答案。
1.執行耗時的操作
在vogella教程,似乎執行耗時的操作,AppWidgetProvider
將onUpdate
推出的一項服務。但是,我做了一個快速測試。推出的Service
和onUpdate
正在同一個線程中運行。因此,如果Service
的onStart
正在執行耗時的操作,則Service
似乎在能夠完成的耗時操作之前被殺死。這是我的測試代碼。
public class MyAppWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.i("CHEOK", Thread.currentThread().getId() + " start LoadWidgetService");
// Build the intent to call the service
Intent intent = new Intent(context.getApplicationContext(), LoadWidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
// Update the widgets via the service
context.startService(intent);
...
public class LoadWidgetService extends Service {
@Override
public void onStart(Intent intent, int startId) {
for (int i = 0; i < 10; i++) {
Log.i("CHEOK", Thread.currentThread().getId() + " " + i + " : try to sleep 10 seconds...");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i("CHEOK", Thread.currentThread().getId() + " " + i + " : try to sleep 10 seconds done!");
}
}
上面的代碼,LoadWidgetService
不會有機會完成整個循環,直到i
達到10.大多數的時候,它就會停止時i
是2。所以,我想該服務被OS所殺,因爲當我比較Service
的onStart
線程ID和AppWidgetProvider
的onUpdate
線程ID時。他們是一樣的。
2.只有從磁盤加載數據一旦
我只想一次加載從磁盤上的數據。但onUpdate
將被重複觸發。那麼,對於我來說,放置「從磁盤加載數據一次」代碼的更合適的地方是什麼?
是的。我的確和你有同樣的想法。但是,到目前爲止,我還沒有看到在小部件中使用「IntentService」的真實代碼示例。我想知道爲什麼... –
順便說一句,你有什麼想法'2。只從磁盤加載數據一次? –
我想問題是,你想從磁盤加載?如果您只想永久加載它,那麼只需禁用小部件自動刷新(將updatePeriodMillis設置爲0)。我相信onUpdate只會在放置小部件時調用一次。 –