Связь с Android ksoap2 не работает при медленном интернет-соединении - PullRequest
0 голосов
/ 10 февраля 2012

Я создал виджет приложения 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();
}
}

1 Ответ

1 голос
/ 12 февраля 2012

Я решил это сам. На самом деле я просто хотел проверить подключение к Интернету, реализовав этот метод:

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);
}

Может быть, это поможет кому-то еще. ; -)

...