我想在後臺服務中成功上傳圖像後,將圖標狀態從紅色更新爲綠色。我正在使用Otto事件總線在服務與活動之間傳輸數據,我可以在成功上傳圖像後訂閱數據並從服務獲取數據。然後我試圖從活動更新我的自定義適配器的Grid視圖,它在調試模式下工作正常,但在運行時不能正常工作。不知道爲什麼它發生像這樣 ..Android - 在調試模式下更新網格UI,但在運行時無法使用Otto更新
我做錯了什麼?任何建議/線索將不勝感激。
這裏是我的事件發佈代碼服務:
的TaskBus.java:
public class TaskBus {
public static Bus bus = new Bus();
}
在onStartCommand稱爲線程上傳圖片:
// start thread to upload image
new Thread(ImageUpload).start();
這裏是上傳線程圖片背景:
public Runnable ImageUpload = new Runnable() {
public void run() {
try {
response = uploadImageToServer(server, imageData);
if (!TextUtils.isEmpty(response)) {
showToastMessage("Image uploaded successfully.");
// update status icon in UI
updateStatus(imageData);
// save/update in local DB
// save/Update code goes here to save status in local DB
} catch (Exception ex) {
ex.printStackTrace();
showToastMessage("Problem occurred while uploading image.");
}
}
};
private void showToastMessage(final String message) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
});
}
這裏是一個圖像的上傳成功後,數據從服務發送到活動代碼:
private void updateStatus(ImageData data) {
final UploadStatusEvent uploadStatusEvent = new UploadStatusEvent();
uploadStatusEvent.data = data;
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
bus.post(uploadStatusEvent);
}
});
}
public class UploadStatusEvent {
public ImageData data;
}
這裏是認購代碼在活動從服務中獲取數據:
// update status icons , it called when image uploaded successfully in Service in background
@Subscribe
public void receiveTakingPhotoServiceUploadImageStatus(TakingPhotoService.UploadStatusEvent uploadStatusEvent) {
ImageData data = uploadStatusEvent.data;
if (data != null) {
imageAdapter.setImageInGridItem(data);
gridView.invalidateViews();
gridView.setAdapter(imageAdapter);
}
}
這裏是我的適配器代碼更新網格視圖:
public void setImageInGridItem(ImageData data) {
try {
GridItem gridItem = getItem(data.position);
gridItem.setStatus(data.status);
gridItems.remove(vehicleImage.position);
gridItems.add(ImageData.position, gridItem);
setNotifyOnChange(true);
this.notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
}
}
感謝您的回覆1.我已經在使用它作爲單身人士 是的,我也在活動中註冊它,但是在哪裏更改了proguard設置? –
我認爲你不會把它當作單例使用,因爲在每個任務上。巴士呼叫您正在創建巴士的新實例。在Task類中創建一個靜態方法getBusInstance(){return bus!= null? bus:bus = new Bus(); }並用它來代替。公共靜態總線總線=新總線()更改爲私有靜態總線=空; 至於proguard設置,有很多事情要檢查,它可能根本不適用。在build.gradle中,檢查minifyEnable值。您的proguard設置可以在proguard-rules.pro文件中找到 – bajicdusko
我將其更改爲單例,但仍然是相同的問題。這裏的事情是它在調試中工作正常,但不是在運行時。即使沒有單身也會發生這樣的情況。 –