2012-02-09 82 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); 
} 

也許這會幫助別人。 ;-)