Что вызывает NullPointerException WebSocketConnection.sendTextMessage
Я интегрировал AutoBahn, чтобы позаботиться о моих потребностях в WebSocket в моем приложении для Android. Это работает хорошо большую часть времени.
Иногда я выхожу из этого журнала:
java.lang.NullPointerException
at de.tavendo.autobahn.WebSocketConnection.sendTextMessage(WebSocketConnection.java:137)
at com.test.testSockets.websockets.Request.GetForceResultsRequest$1.onOpen(GetForceResultsRequest.java:48)
at de.tavendo.autobahn.WebSocketConnection$1.handleMessage(WebSocketConnection.java:370)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5653)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
at dalvik.system.NativeStart.main(Native Method)
Вот мой класс GetForceResultRequest:
public class GetForceResultsRequest extends BaseRequest {
protected final WebSocketOptions mWebSocketOptions = new WebSocketOptions();
private static String m_TAG = GetForceResultsRequest.class.getSimpleName();
private String mRequest = "{\"request\":\"getForceTestResults\"}";
private String mSensorId;
public GetForceResultsRequest(String hostAddress, RemoteCallListener callListener){
mSocketHostAddress = hostAddress;
listener = callListener;
mAutoBahnConnection = new WebSocketConnection();
mWebSocketOptions.setReceiveTextMessagesRaw(true);
mWebSocketOptions.setSocketReceiveTimeout(100000);
mWebSocketOptions.setSocketConnectTimeout(100000);
//mWebSocketOptions.setTcpNoDelay(true);
Log.i(m_TAG, mRequest);
}
@Override
protected Void doInBackground(Void... params){
try {
mAutoBahnConnection.connect(mSocketHostAddress,new String[]{mProtocol} ,new WebSocketHandler(){
@Override
public void onOpen() {
Log.i(m_TAG, "Status: Connected to " + mSocketHostAddress);
mAutoBahnConnection.sendTextMessage(mRequest);
}
@Override
public void onTextMessage(String payload) {
Log.i(m_TAG, "Got echo: " + payload);
}
@Override
public void onRawTextMessage(byte[] payload) {
try {
if(payload!=null) {
mJsonResponse = new String(payload, "UTF-8");
Log.i(m_TAG, mJsonResponse);
parseJson(mJsonResponse, GetForceTestResultResponse.class);
}
//parseJson(mJsonResponse);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
Log.i(m_TAG, e.toString());
listener.onRemoteErrorOccur(e);
} catch (IOException e) {
Log.i(m_TAG, e.toString());
listener.onRemoteErrorOccur(e);
e.printStackTrace();
} catch (InstantiationException e) {
Log.i(m_TAG, e.toString());
e.printStackTrace();
} catch (IllegalAccessException e) {
Log.i(m_TAG, e.toString());
e.printStackTrace();
}
}
@Override
public void onBinaryMessage(byte[] payload) {
Log.i(m_TAG, "ON BINARY MESSAGE");
}
@Override
public void onClose(int code, String reason) {
Log.i(m_TAG, "Connection lost."+ reason);
}
}, mWebSocketOptions);
} catch (WebSocketException e) {
Log.d(m_TAG, e.toString());
listener.onRemoteErrorOccur(e.toString());
}
return null;
}
}
Я звоню это 5 раз в секунду в таймере обратного отсчета. Этот таймер обратного отсчета работает в течение 30 секунд
Так вот метод
private boolean forceTestPoll(){
WebServices.getInstance().getForceTestResults(m_HostAddress, new RemoteCallListener() {
@Override
public void onRemoteCallComplete(Object result) {
GetForceTestResultResponse resultResponse = (GetForceTestResultResponse)result;
List<SensorForceTestResult> list = resultResponse.getSensors();
for(SensorForceTestResult forceTestResult: list){
if(forceTestResult.getForceResult()==1){
mForceDetected = true;
}else {
mForceDetected = false;
}
}
}
@Override
public void onRemoteErrorOccur(Object error) {
Log.i(m_Tag, "ERROR: " +(String)error);
}
});
return mForceDetected;}
Это вызывается в методе обратного отсчета onTick, который вызывается 5 раз в секунду.
поэтому forceTestPoll() возвращает логическое значение, поэтому он называется следующим образом:
if(forceTestPoll()){
//processing here
}
Так что я был бы очень признателен, если бы кто-нибудь мог объяснить, почему я иногда получаю эту ошибку? Я звоню слишком часто?
РЕДАКТИРОВАТЬ
Итак, ниже базовый запрос, который расширен
public class BaseRequest extends AsyncTask<Void, Void, Void>{
protected static WebSocketConnection mAutoBahnConnection;
protected String mSocketHostAddress;
protected String mJsonResponse;
protected RemoteCallListener listener;
protected static final String mProtocol = "sensor_tester_api_v2";
@Override
protected Void doInBackground(Void... params) {return null;}
@Override
protected void onPostExecute(Void v){}
protected void parseJson(String jsonResponse, Object WebSocketsResponse) throws IllegalAccessException, InstantiationException, IOException {
Object response = WebSocketsResponse;
response = new ObjectMapper().readValue(jsonResponse, (Class<Object>) response);
listener.onRemoteCallComplete(response);
}
}