2017-02-27 48 views
0

我想在後臺服務中成功上傳圖像後,將圖標狀態從紅色更新爲綠色。我正在使用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(); 

     } 
    } 

回答

0

我會嘗試改變兩件事。

  1. 使總線成爲一個單身人士,並在整個應用程序中使用相同的實例。
  2. 檢查proguard設置並從中排除TakingPhotoService.UploadStatusEvent並觀察結果。

你還沒有在活動中顯示註冊過程,但既然你說過它正在工作,我猜你已經做到了。但是,如果您不在服務中監聽事件,則不需要在服務中註冊總線。 P.S.當活動結束時,不要忘記取消註冊。

+0

感謝您的回覆1.我已經在使用它作爲單身人士 是的,我也在活動中註冊它,但是在哪裏更改了proguard設置? –

+0

我認爲你不會把它當作單例使用,因爲在每個任務上。巴士呼叫您正在創建巴士的新實例。在Task類中創建一個靜態方法getBusInstance(){return bus!= null? bus:bus = new Bus(); }並用它來代替。公共靜態總線總線=新總線()更改爲私有靜態總線=空; 至於proguard設置,有很多事情要檢查,它可能根本不適用。在build.gradle中,檢查minifyEnable值。您的proguard設置可以在proguard-rules.pro文件中找到 – bajicdusko

+0

我將其更改爲單例,但仍然是相同的問題。這裏的事情是它在調試中工作正常,但不是在運行時。即使沒有單身也會發生這樣的情況。 –

0

在此之前,我在被稱爲updateStatus(imageData);之前更新SQLite數據庫中的狀態。現在我通過updateStatus(imageData)修復了這個問題;保存/更新本地數據庫中的圖像數據後。然後問題解決了。

updateStatus(imageData);移動到線程末尾,即保存本地數據庫固定問題後。

它可以用於某一個。