2012-06-28 2 views
0

У меня есть эта функция в моей onDestroy функции, и это привело к аварии:NullPointer Исключение в OnDestroy

@Override 
protected void onDestroy() { 
    Server.setPresence(false, CONSTANTS.USER.userId); 
    super.onDestroy(); 
} 


Server.Java

private static final String TAG = "Cove Server"; 
private static final String PATH = "http://10.0.0.2:8001/data_connection"; 
private static HttpResponse response = null; 
private static StringEntity se = null; 
private static final int TIMEOUT = 30000; 
private static HttpParams hParams = new BasicHttpParams(); 
private static HttpClient client; 
private static HttpPost post = null; 
public static String actionKey = null; 

private static JSONObject sendRequest(JSONObject req) { 
    try { 
     HttpConnectionParams.setConnectionTimeout(hParams, TIMEOUT); 
     client = new DefaultHttpClient(hParams); 
     actionKey = req.getString("actionKey"); 
     se = new StringEntity(req.toString()); 
     se.setContentEncoding(new BasicHeader(HTTP.CONTENT_ENCODING, 
       "application/json")); 
     se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, 
       "application/json")); 
     post = new HttpPost(PATH); 
     post.setEntity(se); 

     Log.d(TAG, "http request is being sent"); 
     response = client.execute(post); 
     Log.d(TAG, "http request was sent"); 

     if (response != null 
       && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
      InputStream in = response.getEntity().getContent(); 
      String a = convertFromInputStream(in); // CALLS A FUNCTION THAT PARSES THE RESPONSE TO String 
      in.close(); 
      return new JSONObject(a); 
     } 

    } catch (UnsupportedEncodingException e) { 
     Log.d(TAG, "encoding request to String entity faild!"); 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     Log.d(TAG, "executing the http POST didn't work"); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.d(TAG, "executing the http POST didn't work"); 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     Log.d(TAG, "no ActionKey"); 
     e.printStackTrace(); 
    } 
    return null; 
} 

public static JSONObject setPresence(boolean isActive, String userId) { 
    JSONObject request = new JSONObject(); 
    try { 
     request.put("actionKey", (isActive) ? "UserPresenceActive" 
       : "UserPresenceInactive"); 
     request.put("userId", userId); 
     return sendRequest(request); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

LogCat

06-28 12:59:11.970: E/AndroidRuntime(19806): FATAL EXCEPTION: main 
06-28 12:59:11.970: E/AndroidRuntime(19806): java.lang.RuntimeException: Unable to destroy activity {com.yishai/com.thepoosh.MyActivity}: java.lang.NullPointerException 
06-28 12:59:11.970: E/AndroidRuntime(19806): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3124) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3142) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at android.app.ActivityThread.access$1200(ActivityThread.java:127) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1192) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at android.os.Looper.loop(Looper.java:137) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at android.app.ActivityThread.main(ActivityThread.java:4507) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at java.lang.reflect.Method.invokeNative(Native Method) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at java.lang.reflect.Method.invoke(Method.java:511) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at dalvik.system.NativeStart.main(Native Method) 
06-28 12:59:11.970: E/AndroidRuntime(19806): Caused by: java.lang.NullPointerException 
06-28 12:59:11.970: E/AndroidRuntime(19806): at com.thepoosh.MyActivity.onDestroy(MyActivity.java:340) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at android.app.Activity.performDestroy(Activity.java:4629) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1082) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3111) 
06-28 12:59:11.970: E/AndroidRuntime(19806): ... 11 more 

Я подозреваю, что, поскольку сервер не отправляет ответ, а Server.setPresence() не возвращается, и поэтому приложение переходит в ANR.

Верно ли это? Что мне делать, чтобы это исправить? Есть ли другая причина аварии?

+0

Что такое CONSTANTS.USER? if CONSTANTS i file затем предоставить код ...... –

+0

'CONSTANTS.USER' - статическая переменная, которая содержит текущего пользователя – thepoosh

+0

yup, так что может быть null, см. мой ответ и тест, который не является нулевым .... .. –

ответ

1
06-28 12:59:11.970: E/AndroidRuntime(19806): Caused by: java.lang.NullPointerException 
06-28 12:59:11.970: E/AndroidRuntime(19806): at com.thepoosh.MyActivity.onDestroy(MyActivity.java:340) 
06-28 12:59:11.970: E/AndroidRuntime(19806): at android.app.Activity.performDestroy(Activity.java:4629) 

смотрит на onDestroy is last function is stacktrace так называют не пошел Server.setPresence еще .. так это выглядит USER в CONSTANTS.USER.userId может быть нулевым только в этой строке. поэтому поставьте чек, чтобы проверить это.

@Override 
protected void onDestroy() { 
    if(null==CONSTANTS.USER){ 
    Server.setPresence(false, CONSTANTS.USER.userId); 
    }else{ 
     Toast.makeText(this,"is null",Toast.LENGHT_LONG).show(); 
     } 
    super.onDestroy(); 
} 
+0

благодарит кучу. он работал, и теперь все, что у меня есть, - это раздражающее 'android.os.NetworkOnMainThreadException' для вызова HTTP POST в потоке пользовательского интерфейса. – thepoosh

+0

поэтому я думаю, что вы знаете, как справиться с этим ..... :) просто имейте в виду, что это возможно до тех пор, пока ваш результат не поступит в другом потоке с сервера. Ваша деятельность будет уничтожена. –

+1

, пожалуйста, взгляните на мой новый вопрос о это: http://stackoverflow.com/q/11243056/1056359 – thepoosh

Смежные вопросы