Я создал виджет приложения Android, который отображает некоторый текст.При нажатии на виджет текст обновляется путем вызова веб-службы с использованием ksoap2.Все работает нормально, когда мое устройство имеет быстрое подключение к Интернету (Wlan, HSDPA, 3G).Это займет всего одну секунду.Но когда у него только медленное соединение (G или E), оно больше не работает.
Каждый процесс связи занимает около 20 КБ, так что это не так много данных (я полагаю).
Мне было интересно, если я здесь что-то не так делаю.Должен ли я использовать сервис вместо этого?Я попробовал это, но не знал, как справиться с несколькими намерениями.Все примеры, которые я мог найти, используют только 1 намерение, а не метод onReceive, поэтому я не знал, как изменить код.
Так выглядит мой класс AppWidgetProvider.
{
private static String UPDATE_WIDGET = "UpdateWidget";
private static String COUNT_DOWN = "CountDown";
private static String COUNT_UP = "CountUp";
// HARDCODED !!!
private static String currentLeague = "bl1";
private final static String saison = "2011";
private int maxNoOfGroups = 34;
// For all Soap methods
private static Soap soap = new Soap();
// Current group
private static int currentGroupOrderID = soap.getCurrentGroupOrderID(currentLeague);
// Singleton for counting up and down
private static Singleton singleton = Singleton.getInstance();
@Override
public void onDeleted(Context context, int[] appWidgetIds)
{
// TODO Auto-generated method stub
super.onDeleted(context, appWidgetIds);
}
@Override
public void onDisabled(Context context)
{
// TODO Auto-generated method stub
super.onDisabled(context);
}
@Override
public void onEnabled(Context context)
{
// TODO Auto-generated method stub
super.onEnabled(context);
}
@Override
public void onReceive(Context context, Intent intent)
{
// Name of the action of the intent
final String action = intent.getAction();
// Count down group by 1
if(COUNT_DOWN.equals(action))
{
if(currentGroupOrderID + singleton.getCount() == 1)
{
Toast.makeText(context, "Kein vorheriger Spieltag in dieser Saison vorhanden.", Toast.LENGTH_SHORT).show();
}
else
{
singleton.setCount(singleton.getCount()-1);
updateWidgetData(context, intent);
}
}
// Count up group by 1
if(COUNT_UP.equals(action))
{
if(currentGroupOrderID + singleton.getCount() == maxNoOfGroups)
{
Toast.makeText(context, "Kein weiterer Spieltag in dieser Saison vorhanden.", Toast.LENGTH_SHORT).show();
}
else
{
singleton.setCount(singleton.getCount()+1);
updateWidgetData(context, intent);
}
}
// Update current group
if(UPDATE_WIDGET.equals(action))
{
updateWidgetData(context, intent);
}
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++)
{
int appWidgetId = appWidgetIds[i];
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout_simple);
attachIntents(context,remoteViews,appWidgetId);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
/**
* Attaches the intents that are used by the widget.
*
* @param context
* @param remoteViews
* @param appWidgetId
*/
protected void attachIntents(Context context, RemoteViews remoteViews, int appWidgetId)
{
// Creating the intents
Intent updateIntent = new Intent(context, SoccerWidgetProvider.class);
Intent countDownIntent = new Intent(context, SoccerWidgetProvider.class);
Intent countUpIntent = new Intent(context, SoccerWidgetProvider.class);
// Setting the actions
updateIntent.setAction(UPDATE_WIDGET);
countDownIntent.setAction(COUNT_DOWN);
countUpIntent.setAction(COUNT_UP);
// Putting the appWidgetIds as extra for constant reaction of the wigdet
updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
updateIntent.setData(Uri.parse(updateIntent.toUri(Intent.URI_INTENT_SCHEME)));
countDownIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
countDownIntent.setData(Uri.parse(countDownIntent.toUri(Intent.URI_INTENT_SCHEME)));
countUpIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
countUpIntent.setData(Uri.parse(countUpIntent.toUri(Intent.URI_INTENT_SCHEME)));
// Creating the pendingIntents
PendingIntent updatePendingIntent = PendingIntent.getBroadcast(context, 0, updateIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent countDownPendingIntent = PendingIntent.getBroadcast(context, 0, countDownIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent countUpPendingIntent = PendingIntent.getBroadcast(context, 0, countUpIntent, PendingIntent.FLAG_UPDATE_CURRENT);
// Setting the "onClick-listener"
remoteViews.setOnClickPendingIntent(R.id.widget_layout_root_elem, updatePendingIntent);
remoteViews.setOnClickPendingIntent(R.id.back_imageView, countDownPendingIntent);
remoteViews.setOnClickPendingIntent(R.id.forward_imageView, countUpPendingIntent);
// Update the widget
AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, remoteViews);
}
/**
* Updates the widget's content by calling the web service.
*
* @param context
* @param intent
* @param groupOrderID
*/
public void updateWidgetData(Context context, Intent intent)
{
// Calling the web service and parsing the response
Group theGroup = soap.getGroup(currentGroupOrderID + singleton.getCount(), currentLeague, saison);
if(theGroup == null)
{
Toast.makeText(context, "Soap result is null", Toast.LENGTH_SHORT).show();
}
// Current group name
String currentGroupName = theGroup.getGroupName();
// Creating the strings for the textViews
String teams1 = theGroup.returnAllTeams1AsString();
String teams2 = theGroup.returnAllTeams2AsString();
String scores = theGroup.returnAllScoresAsString();
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout_simple);
// Setting the text of the textViews
remoteViews.setTextViewText(R.id.widget_header_textView, currentGroupName);
remoteViews.setTextViewText(R.id.widget_team1_textView, teams1);
remoteViews.setTextViewText(R.id.widget_scores_textView, scores);
remoteViews.setTextViewText(R.id.widget_team2_textView, teams2);
ComponentName widget = new ComponentName(context, SoccerWidgetProvider.class);
AppWidgetManager awm = AppWidgetManager.getInstance(context);
awm.updateAppWidget(widget, remoteViews);
final int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
// This way the widget doesn't stop reacting after some time
if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID)
{
attachIntents(context, remoteViews, appWidgetId);
}
// In case of success make a toast
Toast.makeText(context, "Update complete", Toast.LENGTH_SHORT).show();
}
}