0
目前我有一个小部件下载并显示天气数据。当我将小部件放置在主屏幕上,选择显示天气的位置等时,这很好。但是,当我有两个活动小部件,并且onUpdate被调用时,只有最新添加的内容才会更新。Android更新两个小部件的服务和AsyncTask只更新最新的小部件
WeatherWidget:
public class WeatherWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
//Creating and adding pending intents to each widget, then calling
//updateWeather();
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
private void updateWeather(Context context,
AppWidgetManager appWidgetManager, int[] appWidgetIds, int appWidgetId) {
Intent serviceIntent = new Intent(context, WeatherService.class);
serviceIntent.putExtra("widgetId", appWidgetId);
context.startService(serviceIntent);
}
}
的WeatherService:
public class WeatherService extends Service {
private int widgetId;
private String choice;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
widgetId = intent.getExtras().getInt("widgetId");
SharedPreferences settings = getSharedPreferences("WeatherPrefs",
MODE_PRIVATE);
//"choice" is a string that contains which location to get weather data from
choice = settings.getString(String.valueOf(widgetId) + "s", "def");
initialize(choice);
return Service.START_NOT_STICKY;
}
public void initialize(String choice) {
switch (choice) {
case "Choice1":
try {
URL url = new URL(
"http://www.myurl1");
AsyncTask task = new WeatherRetriever().execute(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
break;
case "Choice2":
try {
URL url = new URL(
"http://www.myurl2");
AsyncTask task = new WeatherRetriever().execute(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
break;
case "Choice3":
try {
URL url = new URL(
"http://www.myurl3");
AsyncTask task = new WeatherRetriever().execute(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
break;
case "Choice4":
try {
URL url = new URL(
"http://www.myurl4");
AsyncTask task = new WeatherRetriever().execute(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
break;
case "Choice5":
try {
URL url = new URL(
"http://www.myurl5");
AsyncTask task = new WeatherRetriever().execute(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
break;
}
}
}
的的AsyncTask WeatherRetriever下载从给定的URL的气象数据,并onPostExecute调用此方法:
private void updateWidget() {
AppWidgetManager appWidgetManager = AppWidgetManager
.getInstance(getApplicationContext());
//Collects the data from the result of WeahterRetriever here, code removed
RemoteViews remoteViews = new RemoteViews(getApplicationContext()
.getPackageName(), R.layout.mywidget);
//Set up the result for the remove view here, code removed
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
这里的问题当我有两个小部件同时处于活动状态时,它们都是几乎在同一时间启动服务。在AsyncTask能够为第一个小部件完成之前,第二个小部件已经调用了startService,并更改了widgetId的值。我该如何防止这种情况?
马库斯
谢谢你,这个伎俩 – Marcus 2014-10-07 11:50:15