GreenRobot EventBusException: Subscriber class already registered to event class - greenrobot-eventbus

I have a MainActivity and a Service in my android app. I have registered both to the EventBus and when I start the service from the main activity manually via a switch everything works fine. However, when I start the service from an AlarmManager alarm I my app crashes with the following stack trace:
05-08 21:21:00.051: E/AndroidRuntime(22362): FATAL EXCEPTION: main
05-08 21:21:00.051: E/AndroidRuntime(22362): Process: com.hesselapplications.shade, PID: 22362
05-08 21:21:00.051: E/AndroidRuntime(22362): java.lang.RuntimeException: Unable to start service com.hesselapplications.shade.ShadeService#39251d8 with Intent { cmp=com.hesselapplications.shade/.ShadeService }: de.greenrobot.event.EventBusException: Subscriber class com.hesselapplications.shade.ShadeService already registered to event class com.hesselapplications.shade.EventBus.ColorChangedEvent
05-08 21:21:00.051: E/AndroidRuntime(22362): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2881)
05-08 21:21:00.051: E/AndroidRuntime(22362): at android.app.ActivityThread.access$2100(ActivityThread.java:144)
05-08 21:21:00.051: E/AndroidRuntime(22362): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376)
05-08 21:21:00.051: E/AndroidRuntime(22362): at android.os.Handler.dispatchMessage(Handler.java:102)
05-08 21:21:00.051: E/AndroidRuntime(22362): at android.os.Looper.loop(Looper.java:135)
05-08 21:21:00.051: E/AndroidRuntime(22362): at android.app.ActivityThread.main(ActivityThread.java:5221)
05-08 21:21:00.051: E/AndroidRuntime(22362): at java.lang.reflect.Method.invoke(Native Method)
05-08 21:21:00.051: E/AndroidRuntime(22362): at java.lang.reflect.Method.invoke(Method.java:372)
05-08 21:21:00.051: E/AndroidRuntime(22362): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
05-08 21:21:00.051: E/AndroidRuntime(22362): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
05-08 21:21:00.051: E/AndroidRuntime(22362): Caused by: de.greenrobot.event.EventBusException: Subscriber class com.hesselapplications.shade.ShadeService already registered to event class com.hesselapplications.shade.EventBus.ColorChangedEvent
05-08 21:21:00.051: E/AndroidRuntime(22362): at de.greenrobot.event.EventBus.subscribe(EventBus.java:179)
05-08 21:21:00.051: E/AndroidRuntime(22362): at de.greenrobot.event.EventBus.register(EventBus.java:165)
05-08 21:21:00.051: E/AndroidRuntime(22362): at de.greenrobot.event.EventBus.register(EventBus.java:133)
05-08 21:21:00.051: E/AndroidRuntime(22362): at com.hesselapplications.shade.ShadeService.onStartCommand(ShadeService.java:51)
05-08 21:21:00.051: E/AndroidRuntime(22362): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2864)
05-08 21:21:00.051: E/AndroidRuntime(22362): ... 9 more
Here is my MainActivty code:
public class MainActivity {
private SwitchCompat mSwitch;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSwitch = (SwitchCompat) findViewById(R.id.switch_filter);
mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) Shade.startShade(MainActivity.this);
else Shade.stopShade(MainActivity.this);
}
});
}
public void onEventMainThread(ShadeStartEvent event) {
mSwitch.setChecked(true);
}
public void onEventMainThread(ShadeStopEvent event){
mSwitch.setChecked(false);
}
#Override
protected void onStart() {
super.onStart();
mSwitch.setChecked(Shade.isActive);
EventBus.getDefault().register(this);
}
#Override
protected void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
}
And here is my Service code:
public class MyService extends Service {
public void onEvent(ShadeStopEvent event) {
EventBus.getDefault().unregister(ShadeService.this);
}
public void onEvent(ColorChangedEvent event){
}
#Override
public void onTaskRemoved(Intent rootIntent) {
Shade.stopShade(this);
super.onTaskRemoved(rootIntent);
}
#Override
public int onStartCommand(Intent intent, int flags, int startId) {
EventBus.getDefault().register(ShadeService.this);
return START_NOT_STICKY;
}
}
Lastly here is class with the startShade and stopShade methods. This is also the broadcast receiver that receives the aforementioned alarm:
public class Shade extends BroadcastReceiver {
public static boolean isActive;
#Override
public void onReceive(Context context, Intent intent) {
if (isStartAlarm) {
startShade(context);
} else if (isStopAlarm) {
stopShade(context);
}
}
public static void startShade(Context context) {
if (!isActive) {
Intent intent = new Intent(context, ShadeService.class);
context.startService(intent);
EventBus.getDefault().post(new ShadeStartEvent());
isActive = true;
}
}
public static void stopShade(Context context) {
if (isActive) {
EventBus.getDefault().post(new ShadeStopEvent());
Intent intent = new Intent(context, ShadeService.class);
context.stopService(intent);
isActive = false;
}
}
}
What is causing this crash. How can I resolve it?

The issue is the you are trying to register the service twice as you can see in the trace. The service isn't unregistered therefore the easiest option for you is to check whether the service is registered before you register it EventBus.getDefault().isRegistered(...)or check why the service isn't stopped and therefore still registered. For example:
if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}

Maybe it's better to unregister from the event in onPause() callback?
#Override
protected void onPause() {
super.onPause();
EventBus.getDefault().unregister(this);
}

Related

MissingPluginException(No implementation found for method on channel) for custom ios/android beacon plugin

I wrote a plugin for ios and android, to receive beacon data in flutter. It works for android and earlyer for ios too. Now I started it again, and it doesnt run on ios anymore, except I hot restart it.
The Error I got was:
Unhandled Exception: MissingPluginException(No implementation found for method startScanningBeacons on channel get_beacons)
#0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:165:7)
<asynchronous suspension>
#1 GetBeacons.startScanningBeacons (package:get_beacons/get_beacons.dart:18:18)
<asynchronous suspension>
#2 DataController.startRangingBeacons (package:beacon_basel/controller/DataController.dart:148:26)
Here the Plugin Class:
class GetBeacons {
static const MethodChannel _channel = const MethodChannel('get_beacons');
static const EventChannel _beaconDataChannel = const EventChannel('get_beacons_stream');
static const EventChannel _inRegionChannel = const EventChannel('beacon_in_range_stream');
static Future<int?> get startScanningBeacons async {
int? start = await _channel.invokeMethod('startScanningBeacons');
return start;
}
}
The Swift part is:
public class SwiftGetBeaconsPlugin: NSObject, FlutterPlugin, CLLocationManagerDelegate {
var beaconDataEventSink: FlutterEventSink?
var inRangeEventSink: FlutterEventSink?
init(beaconDataEventSink: FlutterEventSink?, inRangeEventSink: FlutterEventSink?) {
self.beaconDataEventSink = beaconDataEventSink
self.inRangeEventSink = inRangeEventSink
}
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "get_beacons", binaryMessenger: registrar.messenger())
let eventHandler = EventsStreamHandler(channel: channel, registrar: registrar)
let eventChannel = FlutterEventChannel(name: "get_beacons_stream", binaryMessenger: registrar.messenger())
eventChannel.setStreamHandler(eventHandler)
let inRangeEventChannel = FlutterEventChannel(name: "beacon_in_range_stream", binaryMessenger: registrar.messenger())
inRangeEventChannel.setStreamHandler(eventHandler)
}
class EventsStreamHandler: NSObject, FlutterStreamHandler {
private var fBeaconDataEventSink: FlutterEventSink?
private var fInRangeEventSink: FlutterEventSink?
private var fChannel: FlutterMethodChannel
private var fRegistrar: FlutterPluginRegistrar?
init(channel:FlutterMethodChannel,registrar: FlutterPluginRegistrar) {
self.fChannel = channel
self.fRegistrar = registrar
}
}
public func handle(_ call: FlutterMethodCall, result: #escaping FlutterResult) {
if (call.method == "startScanningBeacons"){ ... }
}
...
}
And this is how I use it in main():
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
#override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final StreamController<String> beaconEventsController = StreamController<String>.broadcast();
final StreamController<bool> inRangeEventsController = StreamController<bool>.broadcast();
#override
void initState() {
super.initState();
initPlatformState();
}
#override
void dispose() {
beaconEventsController.close();
inRangeEventsController.close();
super.dispose();
}
Future<void> initPlatformState() async {
if (!inRangeEventsController.hasListener){
GetBeacons.listenToInRange(inRangeEventsController);
}
if (!beaconEventsController.hasListener) {
GetBeacons.listenToBeacons(beaconEventsController);
}
try {
await Future.delayed(Duration(seconds: 2));
await GetBeacons.startScanningBeacons;
} on PlatformException catch (e){}
}
#override
Widget build(BuildContext context) {
return MaterialApp();
}
}
IMPORTANT/WORKAROUND:
As you can see in main(), I putted an await Future.delayed(Duration(seconds: 2)); before calling the "startScanningBeacons" method and then the code works again. So this is a very nasty workaround, I am searching a propper solution for.
QUESTIONS:
Why is the ios part in the .swift file not ready to use, when I call "startScanningBeacons" and how to prevent this error?
POSSIBLE SOLUTIONS:
Not worked for me has everything I read in other threads, like restart, clean, update etc.
Perhaps it can have something to do with this kind of initialization: WidgetsFlutterBinding.ensureInitialized();
Does someone has experiences with this kind of plugin integration for different platforms, like ios?
Best Regards and thanks so much!
Stefan

Appium unable to retrieve webelement using TestNG

We have developed an app and we would like to configure automated tests with Appium and TestNG. The app contains both native and web pages, but the header where reside logo, hamburger (in homepage) and back button is always native.
I get the web resources id from Chrome Inspector, but the command:
WebElement usernameEditText = driver.findElement(By.id("username"));
or
WebElement login = driver.findElement(By.xpath("//input[#id='login-ico']"));
fails with this error:
org.openqa.selenium.NoSuchElementException: An element could not be
located on the page using the given search parameters. (WARNING: The
server did not provide any stacktrace information)
Command duration or timeout: 309 milliseconds
For documentation on this error, please visit:
http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.46.0', revision:
'61506a4624b13675f24581e453592342b7485d71', time: '2015-06-04 10:22:50'
System info: host: 'stefano', ip: '127.0.0.1', os.name: 'Mac OS X',
os.arch: 'x86_64', os.version: '10.11.4', java.version: '1.7.0_79'
*** Element info: {Using=xpath, value=//input[#id='login-ico']}
Session ID: 18098de4-ee19-42b5-9f91-30f6f7e01552
Driver info: io.appium.java_client.android.AndroidDriver
Capabilities [{automationName=Appium, platform=LINUX,
javascriptEnabled=true,
appActivity=com.UnipolSaiApp.activity.MainActivity,
networkConnectionEnabled=true, desired={automationName=Appium,
platformVersion=5.0.1, platformName=Android, deviceName=Android,
appActivity=com.UnipolSaiApp.activity.MainActivity, device=Android,
appPackage=com.UnipolSaiApp}, locationContextEnabled=false,
appPackage=com.UnipolSaiApp, platformVersion=5.0.1,
databaseEnabled=false, deviceName=9b984ca9, platformName=Android,
webStorageEnabled=false, device=Android, warnings={},
takesScreenshot=true}]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:204)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:156)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:605)
at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:43)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:358)
at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:455)
at io.appium.java_client.DefaultGenericMobileDriver.findElementByXPath(DefaultGenericMobileDriver.java:129)
at io.appium.java_client.AppiumDriver.findElementByXPath(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.findElementByXPath(AndroidDriver.java:1)
at org.openqa.selenium.By$ByXPath.findElement(By.java:358)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:350)
at io.appium.java_client.DefaultGenericMobileDriver.findElement(DefaultGenericMobileDriver.java:51)
at io.appium.java_client.AppiumDriver.findElement(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.findElement(AndroidDriver.java:1)
at pages.LoginPage.login_success(LoginPage.java:25)
at scenarios.AppiumTest.loginTest(AppiumTest.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:673)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:842)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1166)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.runWorkers(TestRunner.java:1178)
at org.testng.TestRunner.privateRun(TestRunner.java:757)
at org.testng.TestRunner.run(TestRunner.java:608)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1158)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1083)
at org.testng.TestNG.run(TestNG.java:999)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:74)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:121)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Instead, the retrieving of native elements occur with success.
Here the code of my AndroidSetup:
public class AndroidSetup {
protected AndroidDriver driver;
protected void prepareAndroidForAppium() throws MalformedURLException {
File appDir = new File("/path_of_apk");
File app = new File(appDir,"*****.apk");
DesiredCapabilities dc = new DesiredCapabilities();
dc.setCapability("deviceName","Android");
dc.setCapability("platformVersion","5.0.1");
dc.setCapability("platformName","Android");
//dc.setCapability(CapabilityType.BROWSER_NAME, "browser");
dc.setCapability("device","Android");
dc.setCapability("appPackage","com.*******");
dc.setCapability("appActivity","com.*******.MainActivity");
//other caps
//dc.setCapability("app",app.getAbsolutePath());
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), dc);
Set<String> contexts = driver.getContextHandles();
for (String ctx : contexts) {
System.out.println(ctx);
}
}
}
Here the AppiumTest:
public class AppiumTest extends AndroidSetup {
#BeforeClass
public void setUp() throws Exception {
prepareAndroidForAppium();
}
#AfterClass
public void tearDown() throws Exception {
driver.quit();
}
#Test
public void loginTest() throws InterruptedException
{
new LoginPage(driver).login_success();
}
}
Here the BaePage class:
public class BasePage {
protected WebDriver driver;
String app_package_name = "com.****:id/";
public BasePage(WebDriver driver) {
this.driver = driver;
}
protected void waitForVisibilityOf(By locator) {
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
}
protected void waitForClickabilityOf(By locator) {
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeClickable(locator));
}
}
And here the LoginPage:
public class LoginPage extends BasePage {
public LoginPage(WebDriver driver) {
super(driver);
}
public LoginPage login_success() throws InterruptedException {
Thread.sleep(30000);
WebElement login = driver.findElement(By.xpath("//input[#id='login-ico']"));
login.click();
WebElement usernameEditText = driver.findElement(By.id("usernameET"));
usernameEditText.sendKeys("****");
WebElement passwordEditText = driver.findElement(By.id("passwordET"));
passwordEditText.sendKeys("*****");
WebElement loginButton = driver.findElement(By.id("submitBtn"));
loginButton.click();
return new LoginPage(driver);
}
}
The following code:
Set<String> contexts = driver.getContextHandles();
for (String ctx : contexts) {
System.out.println(ctx);
}
returns just NATIVE_APP entry.
Can you explain me what's wrong? It's an error about the Appium configuration?

How to find roles of a user in cloudboost

I am trying to get all the roles assigned to user when user logs in, using the code below.
public class roles extends AsyncTask <String,Void,Void>{
#Override
protected Void doInBackground(String... params) {
final CloudUser user = new CloudUser();
final CloudRole role = new CloudRole("MCA");
user.setUserName(params[0]);
user.setPassword(params[1]);
try {
user.logIn(new CloudUserCallback() {
#Override
public void done(CloudUser cloudUser, CloudException e) throws CloudException {
if (cloudUser != null) {
System.out.println("login Successful");
System.out.println(cloudUser.getUserName());
cloudUser.isInRole(role);
}
if (e != null) {
System.out.println("In logn exception");
e.printStackTrace();
}
}
});
} catch (CloudException e) {
e.printStackTrace();
}
return null;
}
}
I am getting the following error:
FATAL EXCEPTION: AsyncTask #1
Process: com.rakesh_kr.image, PID: 31256
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.ClassCastException: io.cloudboost.json.JSONArray cannot be cast to java.util.ArrayList
at io.cloudboost.CloudUser.isInRole(CloudUser.java:335)
at com.rakesh_kr.image.MainActivity$roles$1.done(MainActivity.java:174)
at io.cloudboost.CloudUser.logIn(CloudUser.java:219)
at com.rakesh_kr.image.MainActivity$roles.doInBackground(MainActivity.java:168)
at com.rakesh_kr.image.MainActivity$roles.doInBackground(MainActivity.java:155)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
This is a bug that occured in versions of CloudBoost JavaSDK prior to v1.0.7, this has been fixed, please clone the latest sources from github or get the latest jar(1.0.7) which should be available on maven in a few hours from now.

SecurityException even after giving uses-permission tag for vibration

I am trying to make an Android app which starts vibration on button click.
below is the code related to vibration, I have added uses-permission tag in Android manifest file, still the app terminates giving SecurityException
public class MainActivity extends AppCompatActivity {
private Vibrator v;
TimerTask timerTask;
int n=0;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
}
public void startTimer(View view) {
final Handler handler = new Handler();
Timer mTimer = new Timer();
v.vibrate(2000);
timerTask = new TimerTask() {
#Override
public void run() {
boolean post = handler.post(new Runnable() {
#Override
public void run() {
TextView timer = (TextView) findViewById(R.id.timer);
timer.setText(n);
n++;
}
});
}
};
mTimer.schedule(timerTask, 0, 100);
}
logcat:
06-17 03:41:12.962 8851-8851/com.neuroapp.ojas.neuroapp W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40c3ba68)
06-17 03:41:13.022 8851-8851/com.neuroapp.ojas.neuroapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:3099)
at android.view.View.performClick(View.java:3571)
at android.view.View$PerformClick.run(View.java:14247)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4517)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at android.view.View$1.onClick(View.java:3094)
at android.view.View.performClick(View.java:3571)
at android.view.View$PerformClick.run(View.java:14247)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4517)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.SecurityException: Requires VIBRATE permission
at android.os.Parcel.readException(Parcel.java:1327)
at android.os.Parcel.readException(Parcel.java:1281)
at android.os.IVibratorService$Stub$Proxy.vibrateMagnitude(IVibratorService.java:290)
at android.os.Vibrator.vibrate(Vibrator.java:88)
at android.os.Vibrator.vibrate(Vibrator.java:57)
at com.neuroapp.ojas.neuroapp.MainActivity.startTimer(MainActivity.java:48)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at android.view.View$1.onClick(View.java:3094)
at android.view.View.performClick(View.java:3571)
at android.view.View$PerformClick.run(View.java:14247)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4517)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
at dalvik.system.NativeStart.main(Native Method)

spring websocket : SubProtocolWebSocketHandler

I have stability problems with Spring web-sockets. Sometimes I have a similar exception to that describe in https://jira.spring.io/browse/SPR-12812.
The patch is not available, then I have implemented my own code with a custom SubProtocolWebSocketHandler.
public class WBSSubProtocolWebSocketHandler extends SubProtocolWebSocketHandler {
private static final Logger LOG = LoggerFactory.getLogger(WBSSubProtocolWebSocketHandler.class);
public WBSSubProtocolWebSocketHandler(MessageChannel clientInboundChannel, SubscribableChannel clientOutboundChannel) {
super(clientInboundChannel, clientOutboundChannel);
}
#Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
super.afterConnectionClosed(session, status);
LOG.debug("WebSocket Connection closed for client with session ID {}", session.getId());
}
#Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// WebSocketHandlerDecorator could close the session
// https://jira.spring.io/browse/SPR-12812
if (!session.isOpen()) {
LOG.warn("WebSocket Connection established for client with session ID {} was closed.", session.getId());
return;
}
super.afterConnectionEstablished(session);
LOG.debug("WebSocket Connection established for client with session ID {}", session.getId());
}
#Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
super.handleTransportError(session, exception);
LOG.warn("WebSocket transport error for client with session ID {}", session.getId());
}
#Override
public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception {
super.handleMessage(session, message);
LOG.debug("Websocket incoming message ({}) from client with session ID {}", message.getPayload().toString(), session.getId());
}
#Override
public void handleMessage(Message message) throws MessagingException {
super.handleMessage(message);
LOG.debug("Websocket incoming message : {}, header {}", message);
}
}
Now my problem is to reproduce the exception to see if the problem is solved. I tried various ways, but without success. I can not reproduce the closing of the connection. Does anyone have an idea?
We also have a second problem. The client application (angularjs application) sometimes reports that the socket-web connection is lost. But I do not understand why because on the server I have no error / warning in the logs.
How can I identify the problem and reproduce it?

Resources