2016-09-17 12 views
1

내 AppWidgetProvider에서 Greenbot Eventbus 라이브러리를 사용하는 방법을 파악하려고합니다. 나는 작동하지 않는 다음을 시도했다 :위젯에서 Eventbus를 사용하는 방법은 무엇입니까?

public class SimpleWidgetProvider extends AppWidgetProvider { 
    RemoteViews remoteViews; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     final int count = appWidgetIds.length; 

     for (int i = 0; i < count; i++) { 
      int widgetId = appWidgetIds[i]; 
      remoteViews = new RemoteViews(context.getPackageName(), R.layout.simple_widget); 
      //set image 
      remoteViews.setImageViewResource(R.id.piggy_bank, R.drawable.piggy_bank); 

      Intent intent = new Intent(context, SimpleWidgetProvider.class); 
      intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
      intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
        0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
      //set refresh button 
      remoteViews.setOnClickPendingIntent(R.id.refresh_btn, pendingIntent); 
      appWidgetManager.updateAppWidget(widgetId, remoteViews); 
     } 
    } 

    @Override 
    public void onEnabled(Context context) { 
     super.onEnabled(context); 
     EventBus.getDefault().register(this); 
    } 

    //set total price 
    @Subscribe 
    public void onPriceEvent(TotalPriceEvent event) { 
     double price = event.totalPrice; 
     remoteViews.setTextViewText(R.id.total_amount, String.valueOf(price)); 
    } 

    @Override 
    public void onDisabled(Context context) { 
     EventBus.getDefault().unregister(this); 
     super.onDisabled(context); 
    } 
} 

더 많은 코드를 첨부해야하는지 알려주세요.

답변

2

AppWidgetProvider은 작업을 기반으로 다른 방법으로 브로드 캐스트를 위임하는 특정 onReceive() 메서드가있는 BroadcastReceiver 메서드입니다. 매니 페스트 등록 인스턴스 인 BroadcastReceiver은 오래 살 수 없습니다. 그것들은 방송을 처리하고 죽을만큼 오래 실행되기 때문에 이벤트 버스에 구독하는 것은 예상대로 작동하지 않을 것이고 중첩 패턴을 감안할 때 무의미합니다. SimpleWidgetProvider에 무언가를 알리려면 방송을 보내면됩니다.

예를 들어 SimpleWidgetProvider 클래스에 대한 자체 조치를 정의한 후 onReceive() 메소드에서 확인하십시오. 그것이 우리 것 인 경우 필요에 따라 처리하고 그렇지 않으면 super 메서드를 호출하여 AppWidgetProvider이 올바르게 위임하도록 허용합니다.

public class SimpleWidgetProvider extends AppWidgetProvider { 
    public static final String MY_SPECIAL_ACTION = "com.mycompany.myapp.SPECIAL_ACTION"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(MY_SPECIAL_ACTION.equals(intent.getAction())) { 
      // Do your thing 
     } 
     else { 
      // Not our action, so let AppWidgetProvider handle it 
      super.onReceive(context, intent); 
     } 
    } 
    ... 
} 

일반적인 방식으로 방송을 보낼 수 있습니다.

Intent widgetNotify = new Intent(context, SimpleWidgetProvider.class); 
widgetNotify.setAction(SimpleWidgetProvider.MY_SPECIAL_ACTION); 
widgetNotify.putExtra(...); 
... 
context.sendBroadcast(widgetNotify); 

은 또한 이러한 방법은 AppWidgetProvider에서 비어로 onEnabled()onDisabled()super 통화, 불필요한 언급한다.

+0

두 번째 코드는 어디에 적합합니까? – Helenesh

+0

'TotalPriceEvent'를'EventBus'에 게시 한 곳이면 어디든지. –