バックグラウンドサービスでイメージを正常にアップロードした後、アイコンのステータスを赤から緑に更新します。私は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();
}
}
返信ありがとうございました1.すでにシングルトンとして使っています はい、アクティビティにも登録されていますが、プロガード設定を変更する場所はありますか? –
私はあなたがシングルトンとしてそれを使用していないと思う、各タスクのためです。あなたはバスの新しいインスタンスを作成しています。タスククラスgetBusInstance(){静的メソッドを作成する{return bus!= null?バス:バス=新しいバス(); }代わりに使用してください。 public static Bus bus =新しいBus()をprivate static Busに変更します。 プロガードの設定は、チェックする項目が複数あり、まったく適用されないことがあります。 build.gradleで、minifyEnable値をチェックします。あなたのproguardの設定はproguard-rules.proファイル – bajicdusko
にありますが、私はシングルトンに変更しましたが、同じ問題です。ここでは、デバッグではうまくいきますが、実行時にはうまくいきません。シングルトンがなくても、このように起こっています。 –