2012-03-18 5 views
3

У меня есть приложение, которое может загрузить некоторые данные из веб-службы (в потоке в onReceive()), нажав на нее. После этого графический интерфейс виджета обновляется в updateWidget(...) (= re-drawn).Невозможно сделать тост из потока в классе AppWidgetProvider

Я хочу сделать тост, когда это будет сделано. Я очень старался сделать тост в конце updateWidget(...), передав контекст из потока в тост, но это не сработало. Проблема, похоже, является контекстом. Потому что мой класс наследует от AppWidgetProvider и НЕ от деятельности Я НЕ МОГУ использовать такие вещи, как getApplicationContext(). Наверное, мне просто нужно получить правильный контекст для тоста, но я понятия не имею, как это сделать.

Вот соответствующий код:

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

    // This way the context and the intent can be used in the thread 
    final Context ctx = context; 
    final Intent i = intent; 

    if (action.equals(COUNT_DOWN) == true || action.equals(COUNT_UP) == true) 
    { 
     // Show toast to inform the user that this feature is only available in the full version 
     Toast.makeText(context, R.string.no_groupchange, Toast.LENGTH_SHORT).show(); 
    } 

    // Update current group 
    else if (action.equals(UPDATE_WIDGET)) 
    { 
     // Check for internet connection 
     if (isOnline(context) == true) 
     { 
      // Show toast to inform the user that refreshing the data has started 
      Toast.makeText(context, R.string.refreshing, Toast.LENGTH_SHORT).show(); 

      // This way the complete internet communication is independent from the GUI 
      // Also works at low speed internet connection 
      Thread myThread = new Thread(new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        // TODO Auto-generated method stub 
        int currentGroupOrderID = soapManager.getCurrentGroupOrderID(LEAGUE_SC); 
        theGroup = soapManager.getGroup(currentGroupOrderID, LEAGUE_SC, SAISON); 
        nextMatch = soapManager.getNextMatch(LEAGUE_SC); 

        updateWidget(ctx, i);      
       } 
      }); 

      myThread.start();    
     } 
     else 
     { 
      Toast.makeText(context, R.string.no_internet, Toast.LENGTH_SHORT).show(); 
     } 
    } 

    super.onReceive(context, intent); 
} 

public void updateWidget(Context context, Intent intent) 
{   
    // Creating remoteViews for updating the widget 
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout_simple); 

    // Fill the textViews with text 
    setTextViewsFromTheGroup(remoteViews); 
    setNextMatchTextView(remoteViews); 

    // Update the widget 
    ComponentName widget = new ComponentName(context, SoccerWidgetProvider.class); 
    AppWidgetManager awm = AppWidgetManager.getInstance(context); 
    awm.updateAppWidget(widget, remoteViews); 

    // This way the widget doesn't stop reacting after some time 
    final int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 

    if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) 
    { 
     attachIntents(context, remoteViews, appWidgetId); 
    } 

    // HERE I WANT TO MAKE A TOAST!!! 
} 

ответ

1

Вам необходимо позвонить Toast.makeText из потока пользовательского интерфейса. Вы можете сделать это, выполнив:

runOnUiThread(new Runnable() { 
    public void run() 
    { 
     Toast.makeText(context, R.string.refreshing, Toast.LENGTH_SHORT).show(); 
    } 
}); 
+3

+1, 'runOnUiThread()' не статический метод :) –

+1

Там нет '' runOnUiThread' на AppWidgetProvider' экземпляра ни – melanke