0
我創建了一個顯示一些文本的Android應用程序小部件。通過使用ksoap2調用Web服務來按下小部件文本更新。一切正常,當我的設備有一個快速的互聯網連接(無線局域網,HSDPA,3G)。它只需要一秒鐘。但是當它只有一個緩慢的連接(G或E)時,它不再起作用。Android ksoap2通信不適用於低速互聯網連接
每個通信過程大約需要20kb,所以這不是那麼多的數據(我猜)。
我想知道我在這裏做錯了什麼。我應該使用服務嗎?我嘗試過,但不知道如何處理多個意圖。我能找到的所有示例都只使用1個intent,並且沒有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();
}
}