2014-10-07 73 views
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的值。我该如何防止这种情况?

马库斯

回答

1

你可以尝试在存储阵列小部件的ID,并删除他们在您与在的onDestroy你的widget呼叫服务?

+0

谢谢你,这个伎俩 – Marcus 2014-10-07 11:50:15