2012-02-09 72 views
0

我创建了一个显示一些文本的Android应用程序小部件。通过使用kso​​ap2调用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(); 
} 
} 

回答

1

我自己解决了。其实我只是想通过实现此方法来检查互联网连接:

public boolean isOnline(Context context) 
{ 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 

    if (netInfo != null && netInfo.isConnectedOrConnecting()) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

但事实证明,这也解决了我没有得到的答案有一个缓慢的连接问题。我在onReceive()这样使用它:

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    // Name of the action of the intent 
    final String action = intent.getAction(); 

    // Check for internet connection. Also solves problem of slow internet connection!!! 
    if(isOnline(context) == true) 
    { 
     // 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); 
     } 
    } 
    else 
    { 
     Toast.makeText(context, "No internet connection", Toast.LENGTH_SHORT).show(); 
    } 

    super.onReceive(context, intent); 
} 

也许这会帮助别人。 ;-)