2017-08-20 6 views
0

私のアプリでは、1回のボタンクリックで複数のイベントが生成されることがあるため、複数の類似したトランザクションをサーバーに送信してデータの整合性を損なうことがあります問題。ここではコードの流れですが、このコードはユーザの電話で実行されることに注意してください。これは時に弱い接続を持つことがあるため、SQLiteにデータを格納し、インターネットに接続するとSQLiteテーブルからデータをフェッチする別の同期サービスがあります。つながっている。ここでAndroidアプリでボタンをクリックするとランダムに動作する

クリックがキャプチャされると、イベントが主な活動のために掲示される場所です(ランディングページ)

@OnClick(R.id.btn_add_attempt) 
    public void onAttemptClick() { 
     try{ 
     btnAddAttempt.setEnabled(false); 
     EventBus.getDefault().post(new ExampleActionEvent()); 
     moveToHomePage(); 
     } catch (Exception e){ 
     e.printStackTrace(); 
     Crashlytics.logException(e); 
     } 
} 

は私の主な活動からのイベントサブスクリプションです。

@Subscribe() 
    public void onExampleAction(ExampleActionEvent exampleActionEvent) 
    { 
     if(application == null) application = (ExApplication) getApplication(); 

     final Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 

       ArrayList<Something> somethings = application.getArray().getsomethings(); 
       if (!ExUtils.validatesomethings(somethings)){ 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          RiderUtils.showSimplePopup(
            MainLandingActivity.this, 
            getString(R.string.title_alert), 
            getString(R.string.alert_message), 
            getString(R.string.done), 
            null, 
            false, 
            new DialogInterface.OnClickListener() { 
             @Override 
             public void onClick(DialogInterface dialog, int which) { 
              showPendingSomething(); 
              ExUtils.moveToPending(MainLandingActivity.this); 
             } 
              }, 
            null, 
            false); 
         } 
        }); 
        return; 
       } 
       status = application.getArray().getStatus(); 

       imageLocalPath = application.getArray().getsomethings().get(0).getPhotoPath(); 

       Log.d(Const.TAG, "image path is: "+imageLocalPath); 

       try { 
        ExUtils.pushExampleActionEvent(application.getArray(), MainLandingActivity.this, xyz, abc); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       FileWriteEvent fileWriteEvent = null; 
       String currentTimestamp = application.getArray().getTimestamp(); 

       switch (status) { 
        case Const.UPDATE_SUCCESS: 
         fileWriteEvent = new FileWriteEvent(Const.EVENT_CSV_FILE_SUCCESS_VALUE, application.getArray(), "", 
           cachedLocation, currentTimestamp, null); 
         break; 
        case Const.UPDATE_ATTEMPTED: 
         fileWriteEvent = new FileWriteEvent(Const.EVENT_CSV_FILE_ATTEMPTED_VALUE, riderApplication.getBulkArray(), "", 
           cachedLocation, currentTimestamp, null); 
         ExUtils.showSnackbar(holder, getString(R.string.Example), Snackbar.LENGTH_LONG); 
         break; 
       } 

       if(fileWriteEvent != null) 
       { 
        EventBus.getDefault().post(fileWriteEvent); 
       } 

       createAll(); //SQLite DB call for Inserting some data 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         try { 
          switch (status) { 
           case Const.UPDATE_SUCCESS: 
            RiderUtils.showSnackbar(holder, getString(R.string.Success), Snackbar.LENGTH_LONG); 
            break; 
           case Const.UPDATE_ATTEMPTED: 
            RiderUtils.showSnackbar(holder, getString(R.string.Failed), Snackbar.LENGTH_LONG); 
            break; 
          } 
         }catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       }); 
      } 
     }); 

     thread.start(); 
    } 

私はそれがランダムに時々ふらちな理由を理解することはできませんよ、それ以外の場合は、スムーズに実行、したがって、私はデバッグ中に問題をregenrateすることはできませんよ。

答えて

0

時々私は問題をもう一度見て、私の前で働いていた開発者がSingleInstanceと宣言していないことがわかったので、Notification DrawerからNotification Drawerからアプリケーションを開いたときに毎回アプリが実行されている場合は、新しいアクティビティが作成され、重複イベントを作成して問題を引き起こしていたEventBusに登録していました。

関連する問題