2016-09-07 5 views
1

내 모든보기에는 사용자에게 알림이있는 경우 빨간색 점이있는 아이콘이있어서 일정한 (매 몇 분 간격) 폴링을 만들고 알림이 있는지 확인합니다 . @Subscrtibe이 실행되지 않는 것을 제외하고. 내가 어쩌면 원인 일 것이라고 생각한 한 가지는 HomeActivity이 등록되기 전에 게시를 시작하지만 타이머가 문제가 될 것이라고 생각하지 않는다는 것입니다. 사용자가 성공적으로 로그인하면Ottos 버스를 사용하여 '알림 폴링'

public class NotificationUtils { 

    private static Timer timer; 

    private static final int MINUTES = 1000 * 60; 
    private static Context applicationContext; 

    public static void startTask(Context context){ 
     checkNotifications(); 
     applicationContext = context; 
     timer = new Timer(); 
     timer.schedule(task, 0L, MINUTES); 
    } 

    public static void killTask(){ 
     timer.cancel(); 
     timer.purge(); 
    } 

    static TimerTask task = new TimerTask() { 
     @Override 
     public void run() { 
      checkNotifications(); 
     } 
    }; 

    private static void checkNotifications(){ 
     RestInterface service = RestService.getRequestInstance(applicationContext); 
     Call<Boolean> call = service.hasNotificatrions(SessionUser.getInstance().getUser().getId()); 
     call.enqueue(new Callback<Boolean>() { 
      @Override 
      public void onResponse(Call<Boolean> call, Response<Boolean> response) { 
       sendNotificationImage(response.body()); 
      } 

      @Override 
      public void onFailure(Call<Boolean> call, Throwable t) { 
       Log.w("TimerTask", "Failed"); 
      } 
     }); 
    } 

    private static void sendNotificationImage(boolean hasUnreadNotifications){ 
     if(hasUnreadNotifications) { 
      BusProvider.getInstance().post(R.drawable.notification_alert_icon); 
     } else { 
      BusProvider.getInstance().post(R.drawable.notification_icon); 
     } 
    } 
} 

, 나는 폴링을 시작 ...

public class LoginActivity extends AppCompatActivity { 
    .... 
    successfulLogin(){ 
     .... 
     NotificationUtils.startTask(getApplicationContext()); 
    } 
} 

그런 다음 내 HomeActivity 나는 추가 .. ..

public class HomeActivity extends AppCompatActivity { 
    .... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 
     BusProvider.getInstance().register(this); 
    } 
    .... 
    @Subscribe 
    public void setNotification(int imageResource){ 
     notificationButton.setImageResource(imageResource); 
     Log.w("HomeActivity", "Setting resource"); 
    } 
} 

편집 클래스를 등록하고 가입 BusProvider 클래스

public final class BusProvider { 
    private static final Bus bus = new Bus(); 

    public static Bus getInstance(){ 
     return bus; 
    } 

    private BusProvider(){} 
} 

답변

2

Java primitive types을 이벤트 클래스로 사용하지 마십시오.

public class DisplayNotification { 
    private int resourceId 

    public DisplayNotification(int resourceId){ 
     this.resourceId = resourceId; 
    } 

    public int getResourceId(){ 
     return this.resourceId; 
    } 
} 

변화 함수의 서명이

@Subscribe 
public void setNotification(DisplayNotification event){...} 

로하고 다음과 같이 게시 : 당신은 사용할 수 있습니다

BusProvider.getInstance().post(new DisplayNotification (R.drawable.notification_icon)); 
+0

내가 그 놓친 믿을 수 없어! 고마워요, 이제 잘 작동합니다! – John