2015-01-09 5 views
1

Я работаю над Android-приложением, и я застрял на ошибке. Я пытаюсь связаться с сервером и получить объект JSON с этого сервера. Я создал класс под названием ServerCommunication, который расширяет AsynchTask. Мой класс связи с сервером имеет стандартный метод doInBackground(). В этом методе я пытаюсь проанализировать объект JSON с веб-страницы, но в этом методе создается исключение.BufferedReader/AsynchTask- java.lang.NullPointerException: lock == null

Я должен упомянуть, что im работает на моем сервере локально на моей машине. Поэтому URL-адрес, передаваемый моим сервером, составляет: http://127.0.0.1:9000/getVehicle/2942. Эта веб-страница содержит простой текст объекта JSON. Ill включает объект JSON внизу.

Исключение составляет: java.lang.NullPointerException: lock == null. Это исключение выбрасывается во второй попытке.

Строка, которая вызывает это исключение:

BufferedReader reader = new BufferedReader(new InputStreamReader(
         is, "iso-8859-1"), 8); 

Это строка имеет ошибку, потому что мой InputStream is равно нулю. По какой-то причине эта строка генерирует исключение, поэтому is имеет значение null. Ill включить мой выход журнала для этого в конце этого поста

HttpResponse httpResponse = httpClient.execute(httpPost); 

Вот мой ServerCommunication класс:

class ServerCommunication extends AsyncTask<String, Integer, JSONObject> { 

    public ServerResponse delegate = null; 
    public JSONObject jResult; 

    // this is called whenever you call puhlishProgress(Integer), for example 
    // when updating a progressbar when downloading stuff 
    protected void onProgressUpdate(Integer... progress) { 

    } 

    // the onPostexecute method receives the return type of doInBackGround() 
    protected void onPostExecute(JSONObject result) { 
     delegate.processFinish(result); 
    } 

    @Override 
    protected JSONObject doInBackground(String... params) { 

     InputStream is = null; 
     JSONObject jObj = null; 
     String json = null; 

     Log.e("Params 0", params[0]); 

     try { 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(params[0]); 
      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 

      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 

      is.close(); 
      json = sb.toString(); 
      Log.e("JSON", json); 

     } catch (Exception e) { 
      Log.e("Buffer Error", "Error converting result " + e.toString()); 
     } 
     // try parse the string to a JSON object 
     try { 
      jObj = new JSONObject(json); 
     } catch (JSONException e) { 
      Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

     return jObj; 
    } 
} 

Вот Объект JSON Я пытаюсь разобрать:

{"Bus":[{"pkey":604,"vehicle_id":261,"trip_id":945162,"route_id":2942,"stop_id":1847,"latitude":43.26762008666992,"longitude":-79.9635009765625,"speed":3.0,"label":"504","bearing":110.0,"odometer":1329300.0,"timestamp":1420775313},{"pkey":605,"vehicle_id":284,"trip_id":945024,"route_id":2942,"stop_id":1926,"latitude":43.22480010986328,"longitude":-79.7864990234375,"speed":10.0,"label":"703","bearing":296.0,"odometer":9481600.0,"timestamp":1420775308},{"pkey":607,"vehicle_id":388,"trip_id":944939,"route_id":2942,"stop_id":1368,"latitude":43.247520446777344,"longitude":-79.84809875488281,"speed":12.0,"label":"1008","bearing":288.0,"odometer":2.21116E+7,"timestamp":1420775317},{"pkey":610,"vehicle_id":422,"trip_id":945158,"route_id":2942,"stop_id":2145,"latitude":43.2575798034668,"longitude":-79.92250061035156,"speed":0.0,"label":"1205","bearing":98.0,"odometer":203000.0,"timestamp":1420775296},{"pkey":623,"vehicle_id":402,"trip_id":945023,"route_id":2942,"stop_id":1955,"latitude":43.25736999511719,"longitude":-79.87146759033203,"speed":8.0,"label":"1102","bearing":286.0,"odometer":5067800.0,"timestamp":1420775311},{"pkey":630,"vehicle_id":276,"trip_id":945154,"route_id":2942,"stop_id":3089,"latitude":43.25257110595703,"longitude":-79.85984802246094,"speed":4.0,"label":"518","bearing":184.0,"odometer":5778500.0,"timestamp":1420775286},{"pkey":634,"vehicle_id":294,"trip_id":945161,"route_id":2942,"stop_id":1923,"latitude":43.23030090332031,"longitude":-79.79962158203125,"speed":13.0,"label":"713","bearing":110.0,"odometer":1.7729E+7,"timestamp":1420775313},{"pkey":639,"vehicle_id":335,"trip_id":944997,"route_id":2942,"stop_id":1320,"latitude":43.257320404052734,"longitude":-79.93509674072266,"speed":2.0,"label":"819","bearing":272.0,"odometer":4.09802E+7,"timestamp":1420775293},{"pkey":653,"vehicle_id":425,"trip_id":944985,"route_id":2942,"stop_id":2560,"latitude":43.23651885986328,"longitude":-79.97097778320312,"speed":13.0,"label":"1208","bearing":210.0,"odometer":5824800.0,"timestamp":1420775288},{"pkey":660,"vehicle_id":317,"trip_id":945168,"route_id":2942,"stop_id":2530,"latitude":43.20967102050781,"longitude":-79.78714752197266,"speed":0.0,"label":"801","bearing":272.0,"odometer":428900.0,"timestamp":1420775282}]} 

Выход для регистрации

01-09 00:05:29.053: W/System.err(21902): org.apache.http.conn.HttpHostConnectException: Connection to http://127.0.0.1:9000 refused 
01-09 00:05:29.053: W/System.err(21902): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:235) 
01-09 00:05:29.053: W/System.err(21902): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:167) 
01-09 00:05:29.053: W/System.err(21902): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:125) 
01-09 00:05:29.053: W/System.err(21902): at org.apache.http.impl.client.DefaultRequestDirector.executeOriginal(DefaultRequestDirector.java:1227) 
01-09 00:05:29.053: W/System.err(21902): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:677) 
01-09 00:05:29.053: W/System.err(21902): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:567) 
01-09 00:05:29.053: W/System.err(21902): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:491) 
01-09 00:05:29.053: W/System.err(21902): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:469) 
01-09 00:05:29.053: W/System.err(21902): at com.example.myshuttle.ServerCommunication.doInBackground(ServerCommunication.java:46) 
01-09 00:05:29.053: W/System.err(21902): at com.example.myshuttle.ServerCommunication.doInBackground(ServerCommunication.java:1) 
01-09 00:05:29.053: W/System.err(21902): at android.os.AsyncTask$2.call(AsyncTask.java:288) 
01-09 00:05:29.053: W/System.err(21902): at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
01-09 00:05:29.053: W/System.err(21902): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
01-09 00:05:29.053: W/System.err(21902): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
01-09 00:05:29.053: W/System.err(21902): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
01-09 00:05:29.053: W/System.err(21902): at java.lang.Thread.run(Thread.java:841) 
01-09 00:05:29.053: W/System.err(21902): Caused by: java.net.ConnectException: failed to connect to /127.0.0.1 (port 9000): connect failed: ECONNREFUSED (Connection refused) 
01-09 00:05:29.053: W/System.err(21902): at libcore.io.IoBridge.connect(IoBridge.java:114) 
01-09 00:05:29.053: W/System.err(21902): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
01-09 00:05:29.053: W/System.err(21902): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:460) 
01-09 00:05:29.053: W/System.err(21902): at java.net.Socket.connect(Socket.java:833) 
01-09 00:05:29.053: W/System.err(21902): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 
01-09 00:05:29.053: W/System.err(21902): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:188) 
01-09 00:05:29.053: W/System.err(21902): ... 15 more 
01-09 00:05:29.053: W/System.err(21902): Caused by: libcore.io.ErrnoException: connect failed: ECONNREFUSED (Connection refused) 
01-09 00:05:29.053: W/System.err(21902): at libcore.io.Posix.connect(Native Method) 
01-09 00:05:29.053: W/System.err(21902): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 
01-09 00:05:29.053: W/System.err(21902): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
01-09 00:05:29.053: W/System.err(21902): at libcore.io.IoBridge.connect(IoBridge.java:112) 
01-09 00:05:29.053: W/System.err(21902): ... 20 more 

Любые предложения?

+0

Вы используете эмулятор? – Rohit5k2

+0

Я запускаю свой сервер с помощью Activator Activator, и я запускаю свое приложение на физическом устройстве Android. –

ответ

0

Так что я нашел мою проблему:

я бегу мой сервер локально на моем ноутбуке на порт 9000. Я мог бы получить доступ к своему серверу на моем ноутбуке с помощью localhost:9000.

Я запускал приложение для Android на своем планшете.Поэтому, когда мой планшет попытался получить доступ к localhost:9000, мой планшет пытался получить доступ к своему локальному хосту, а не к моему ноутбуку.

Чтобы устранить эту ошибку, мне пришлось передать мой планшет MyLaptopIP:9000. Я также должен был убедиться, что мой ноутбук и планшет находятся в одной сети.

1

Здесь

sb.append (линия + "п"); < < < < <

Вы добавляете n с каждой строки при чтении данных из BufferedReader, которые делают неверную строку JSON.

Просто читать и добавлять данные в StringBuilder:

while ((line = reader.readLine()) != null) { 
     sb.append(line); 
    } 

Также перед прохождения InputStream в InputStreamReader убедиться is не null.

+0

Я удалил исправленный sb.append (строка), как было предложено, спасибо за указание на это. Я согласен, я думаю, что это ошибка с моим InputStreamReader. Я не уверен, как работает InputStreamReader, когда дело доходит до http-звонков. Я считаю, что это null. Не знаю, как я могу это проверить. –

+0

@MattyChuck: добавить ошибку null для 'is' перед тем, как перейти к' InputStreamReader' –

+0

Мой входной поток равен null, все еще не уверен, почему хотя –

0

Я написал вспомогательный класс для подключения к WebService. Я думаю, вы можете попробовать.

public class ServiceHelper { 
    /** 
    * Get conten from url 
    * 
    * @param url 
    * @return 
    */ 
    public static String getHttp(String url) { 
     // Get the HTML response 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(url); 
     HttpResponse response; 
     try { 
      response = client.execute(request); 
      return parseStringFromResponse(response); 
     } catch (Exception e) { 

     } 
     return ""; 
    } 

    /** 
    * Post content to url 
    * 
    * @param url 
    * @param params 
    * @return 
    */ 
    public static String postHttp(String url, List<NameValuePair> params) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(url); 
     try { 
      // Add params if need 
      if (params != null && !params.isEmpty()) { 
       httppost.setEntity(new UrlEncodedFormEntity(params)); 
      } 
      // Execute HTTP Post Request 
      HttpResponse response = httpclient.execute(httppost); 
      return parseStringFromResponse(response); 
     } catch (Exception e) { 

     } 
     return ""; 
    } 

    /** 
    * Parse string from {@link HttpResponse} 
    * 
    * @param response 
    * @return 
    * @throws Exception 
    */ 
    public static final String parseStringFromResponse(
      final HttpResponse response) throws Exception { 
     InputStream in = response.getEntity().getContent(); 
     BufferedReader reader = new BufferedReader(
       new InputStreamReader(in)); 
     StringBuilder str = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      str.append(line); 
     } 
     in.close(); 
     return str.toString(); 
    } 
}