2017-02-27 6 views
0

バックグラウンドサービスでイメージを正常にアップロードした後、アイコンのステータスを赤から緑に更新します。私はOttoイベントバスを使用して、サービスとアクティビティの間でデータを転送しています。イメージのアップロードが成功した後、サービスからアクティビティへの購読および取得が可能です。次に、カスタムアダプタのグリッドビューをアクティビティから更新しようとしています。デバッグモードでは正常に動作していますが、実行時には問題ありません。なぜそれが起こっているのか分かりません ..Android - デバッグモードでGrid UIを更新していますが、実行時にOttoを使用して更新しません。

私は間違っていますか?任意の示唆/手がかりをいただければ幸いです。ここで

は、私の場合は、サービス内のコードを公開されています

TaskBus.java:ここ

// start thread to upload image 
     new Thread(ImageUpload).start(); 

アップロードするスレッドです:onStartCommandで

public class TaskBus { 

    public static Bus bus = new Bus(); 
} 

は、画像をアップロードするには、スレッドと呼ばれます背景の画像:

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

私は2つのことを変更しようとします。

  1. バスをシングルトンにして、アプリケーション全体で同じインスタンスを使用します。
  2. プロガードの設定を確認し、それからTakingPhotoService.UploadStatusEventを除外し、結果を観察します。

アクティビティの登録プロセスは表示されていませんが、動作していると言われていますので、行ったと思います。ただし、サービスでイベントをリスンしていない場合は、バスをサービスに登録する必要はありません。 P.P.活動が終了したときにも登録抹消を忘れないでください。

+0

返信ありがとうございました1.すでにシングルトンとして使っています はい、アクティビティにも登録されていますが、プロガード設定を変更する場所はありますか? –

+0

私はあなたがシングルトンとしてそれを使用していないと思う、各タスクのためです。あなたはバスの新しいインスタンスを作成しています。タスククラスgetBusInstance(){静的メソッドを作成する{return bus!= null?バス:バス=新しいバス(); }代わりに使用してください。 public static Bus bus =新しいBus()をprivate static Busに変更します。 プロガードの設定は、チェックする項目が複数あり、まったく適用されないことがあります。 build.gradleで、minifyEnable値をチェックします。あなたのproguardの設定はproguard-rules.proファイル – bajicdusko

+0

にありますが、私はシングルトンに変更しましたが、同じ問題です。ここでは、デバッグではうまくいきますが、実行時にはうまくいきません。シングルトンがなくても、このように起こっています。 –

0

これまではupdateStatus(imageData);と呼ばれていましたが、これはSQLiteデータベースのステータスを更新する前です。今私はこの問題をupdateStatus(imageData)という名前で修正しました。ローカルDBに画像データを保存/更新した後その後、問題は解決しました。

updateStatus(imageData);をスレッドの最後に移動しました。つまり、ローカルDBの固定問題を保存した後です。

いくつかの用途に使用できます。

関連する問題