'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);
}
});
}
}
}
AndroidBus sınıfı ile ilgili sorun nedir? –
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
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) –