2015-07-19 11 views
5

'dan listadapter yenilemek için Otto'yu kullanmak Bir arkadaşım beni takip ettiğinde bir arkadaş listesini yenilemek için Otto kullanıyorum. Kullanıcı arabirimini ana olmayan bir iş parçacığından güncellerken sorun yaşıyorum, bu yüzden ona baktım ve bu sorunu post kullanarak çözdüm. ana üzerinde olması sağlanır GcmListenerService

final Bus bus = BusProvider.getInstance(); 
Log.d(LOG_TAG, "Attempting to post from LBGcmListenerService!"); 
bus.post(new BuddiesEvent()); 

Esasen a tek otobüs yapım ve onun vasıtasıyla gönderme:

public class BusProvider extends Bus{ 

public static final String LOG_TAG = BusProvider.class.getSimpleName(); 

private final Handler mainThread = new Handler(Looper.getMainLooper()); 
private static Bus mInstance; 

public static synchronized Bus getInstance() { 
    if (mInstance == null) { 
     mInstance = new Bus(); 
    } 
    return mInstance; 
} 

@Override 
public void post(final Object event) { 
    if (Looper.myLooper() == Looper.getMainLooper()) { 
     Log.d(LOG_TAG, "Posting event using super!"); 
     super.post(event); 
    } else { 
     mainThread.post(new Runnable() { 
      @Override 
      public void run() { 
       Log.d(LOG_TAG, "Posting event using AndroidBus!"); 
       BusProvider.super.post(event); 
      } 
     }); 

    } 
} 

}

böyle yazı olun: kullandıkları kod şudur iplik. Ancak, bu kodun çalışmasını sağlayamıyorum. Bunun yerine, işleyiciyi, gönderdiğim sınıfta başlattım:

final Bus bus = BusProvider.getInstance(); 
Handler handler = new Handler(Looper.getMainLooper()); 
handler.post(new Runnable() { 
     @Override 
     public void run() { 
     bus.post(new BuddiesEvent()); 
     } 
); 

Bu harika çalışıyor. Ancak her iletiden önce bir Handler nesnesi yapmak zorunda kalmak istemiyorum. Bunun bir Java sorunu mu yoksa bir Android sorunu mu olduğunu bilmiyorum, ama birileri bana bu sorunu nasıl karşılayacağını öğrenmek için bana yardımcı olabilirdi. Teşekkürler!

Sabit: burada doğru kodu koymak:

public class BusProvider extends Bus{ 

public static final String LOG_TAG = BusProvider.class.getSimpleName(); 

private final Handler mainThread = new Handler(Looper.getMainLooper()); 
private static BusProvider mInstance; 

public static synchronized BusProvider getInstance() { 
    if (mInstance == null) { 
     mInstance = new BusProvider(); 
    } 
    return mInstance; 
} 

@Override 
public void post(final Object event) { 
    if (Looper.myLooper() == Looper.getMainLooper()) { 
     Log.d(LOG_TAG, "Posting event using super!"); 
     super.post(event); 
    } else { 
     mainThread.post(new Runnable() { 
      @Override 
      public void run() { 
       Log.d(LOG_TAG, "Posting event using AndroidBus!"); 
       BusProvider.super.post(event); 
      } 
     }); 

    } 
} 

}

+0

AndroidBus sınıfı ile ilgili sorun nedir? –

+0

AndroidBus sınıfını kullandığımda ve Bus örneğimde bus.post'u çağırdığımda (yukarıdaki kodda getInstance yöntemi gösterilmiyor), "veri yolu" varsayılanına ana olmayan bir iş parçacığından erişildiğini belirten bir hata alıyorum ". İşleyiciyi, olayı gönderen sınıfa örnek oluşturduğumda, yukarıdaki kodun ikinci bir biti gibi, tüm işler gayet iyi. @Gil, ** Eğer AndroidBus sınıfını iş yerine bir hizmetten gönderiyorsanız, nasıl olacağını görmek isterdim! ** – Brandon

+0

Bu kod iyi görünüyor. Ben gelebilir olası tek açıklama, iş parçacığı looper çıkarır, bu yüzden Looper.myLooper() Bus (süper sınıf) gönderirken null döndürür. Bu iki, super.post (event) veya AndroidBus.super.post'un (event) hangisinin başarısız olduğunu kontrol edebilir misiniz? (aramalardan hemen önce bazı günlükler koyun) –

cevap

2

Evet, bunu anladım. Buradaki cevap gizemli bir şey değildi. Singleton sınıfımda, bir Bus nesnesi oluşturuyordum ve bunu örnek olarak teslim ediyordum. BusProvider yapmıyordum. Bu nedenle, ben posta çağrıldığında BusProvider geçersiz kılma yöntemini değil, benim durumumda "iş parçacığı güvenli" olmayan Bus yöntemini çağırıyordu. Bu tanıma yansıtmak için kodu değiştirdikten sonra harika çalıştı!