Android 应用中按钮点击时的随机行为
Random behavior on button click at times in Android App
不确定我应该如何表达,但在我的应用程序中,有时单击一个按钮会生成多个事件,因此最终会向服务器发送多个类似的事务,从而导致数据完整性问题。这是代码流程,请注意,此代码在用户 phone 上运行,有时连接可能较弱,因此我将数据存储在 SQLite 中,并且有一个单独的同步服务发送数据(从 SQLite 表中获取)连接到 Internet 时到服务器。
这是捕获点击并发布主要 Activity(着陆页)事件的地方
@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);
}
}
这是我的主要 Activity 的活动订阅。
@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();
}
我无法弄清楚为什么它有时会随机出现异常,否则它会顺利运行,因此我无法在调试时重新生成问题。
所以有时我再次查看问题并发现在我之前工作的开发人员没有将 Main Activity 声明为 SingleInstance 因此每次如果应用程序像我们一样从 Notification Drawer 打开如果应用程序是 运行,则在通知抽屉中显示它,然后它正在创建一个新的 Activity,因此在 EventBus 上注册,这是通过创建重复事件引起的问题。
不确定我应该如何表达,但在我的应用程序中,有时单击一个按钮会生成多个事件,因此最终会向服务器发送多个类似的事务,从而导致数据完整性问题。这是代码流程,请注意,此代码在用户 phone 上运行,有时连接可能较弱,因此我将数据存储在 SQLite 中,并且有一个单独的同步服务发送数据(从 SQLite 表中获取)连接到 Internet 时到服务器。
这是捕获点击并发布主要 Activity(着陆页)事件的地方
@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);
}
}
这是我的主要 Activity 的活动订阅。
@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();
}
我无法弄清楚为什么它有时会随机出现异常,否则它会顺利运行,因此我无法在调试时重新生成问题。
所以有时我再次查看问题并发现在我之前工作的开发人员没有将 Main Activity 声明为 SingleInstance 因此每次如果应用程序像我们一样从 Notification Drawer 打开如果应用程序是 运行,则在通知抽屉中显示它,然后它正在创建一个新的 Activity,因此在 EventBus 上注册,这是通过创建重复事件引起的问题。