【问题标题】:Random behavior on button click at times in Android App有时在 Android 应用程序中单击按钮时的随机行为
【发布时间】:2017-08-20 14:55:29
【问题描述】:

不确定我应该如何表达它,但在我的应用程序中,有时单击一个按钮会生成多个事件,因此它最终会向服务器发送多个类似的事务,这会导致数据完整性问题。这是代码流,请注意,此代码在用户手机上运行,​​有时连接可能较弱,因此我将数据存储在 SQLite 中,并且有一个单独的同步服务在 Internet 时将数据(从 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();
    }

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

【问题讨论】:

    标签: android sqlite concurrency publish-subscribe event-bus


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      相关资源
      最近更新 更多