代码之家  ›  专栏  ›  技术社区  ›  pradex

安卓应用程序中不时点击按钮的随机行为

  •  0
  • pradex  · 技术社区  · 8 年前

    我不知道该如何表达,但在我的应用程序中,有时一个按钮点击会生成多个事件,因此它最终会向服务器发送多个类似的事务,这会导致数据完整性问题。这是代码流,请注意,此代码在用户手机上运行,手机上的连接有时可能较弱,因此我将数据存储在SQLite中,并且有一个单独的同步服务,当互联网连接时,该服务将数据(从SQLite表中提取)发送到服务器。

    这是捕获点击并发布主要活动(登录页)事件的地方

    @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();
        }
    

    我无法理解为什么它有时会随机出现问题,否则它会平稳运行,因此我无法在调试时重新生成问题。

    1 回复  |  直到 8 年前
        1
  •  0
  •   pradex    8 年前

    因此,有时我再次查看这个问题,发现在我之前工作的开发人员没有将主要活动声明为SingleInstance,因此每次如果从通知抽屉打开应用程序,就像我们在通知抽屉中显示它一样,如果应用程序正在运行,然后,它创建了一个新的活动,因此在EventBus上注册,而EventBus通过创建重复事件导致了问题。