2013-01-05 5 views
1

Я пытаюсь получить информацию из JSON-файла, используя HTTPCLient. Странно то, что когда я запускаю приложение на своем телефоне (HTC Desire HD с Android 2.3) или на эмуляторе с Android 2.1 все работает. Но когда я запускаю свое приложение на эмуляторе с Android 4.1.2, на HTC One X (Android 4.1.1) или на Samsung Galaxy SIII (Android 4.0.4) приложение сбой (см. Stacktrace в конце сообщения).Ошибка в HTTP-соединении на Android 4 или выше?

Кто-нибудь знает, в чем проблема? А если нет, есть ли другой способ вызвать мой JSONfile? Может быть, тогда это сработает.

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

RoosterWijzigingen.java (есть некоторый код отсутствует, чтобы сделать его короче, потому что это не имеет отношения к вопросу):

package pws.sgdbroosterapp; 

public class RoosterWijzigingen extends ListActivity { 

    JSONArray jArray; 
    String result = null; 
    InputStream is = null; 
    StringBuilder sb = null; 
    JSONArray klassen = null; 
    JSONArray mededelingen = null; 
    JSONArray rooster = null; 
    String status = null; 
    String type = null; 
    String datum = null; 
    String versie = null; 
    String minutenperlesuur = null; 
    String afwezig = null; 
    String mededeling = null; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     super.onCreate(savedInstanceState); 

     JSONObject json = JSONfunctions.getJSONfromURL("http://selenight.nl/Wijzigingen/2.1/wijzigingen.json"); 

     //new AsyncTask<Void, Void, String>() { 

      //@Override 
      //protected String doInBackground(Void... params) { 
      // Runs on own thread 
      //JSONObject json = JSONfunctions.getJSONfromURL("http://selenight.nl/Wijzigingen/2.1/wijzigingen.json"); 

      //return json.toString(); 
      //} 

      //protected void onPostExecute(String result) { 
      // someMethod(Send json); 
      //Log.v("Stackoverflow", result); 
      //} 

     //}.execute(); 


      try{ 
       // Getting Array of Klassen 
       klassen = json.getJSONArray("klassen"); 

       // Status, type, datum, versie, minutenperlesuur, afwezig en medeleningen worden uit JSOn file gehaald en opgeslagen in Strings 
       status = json.getString("status"); 
             //"failure"; 
       type = json.getString("type"); 
       datum = json.getString("datum"); 
       versie = json.getString("versie"); 
       minutenperlesuur = json.getString("minutenperlesuur"); 
       afwezig = json.getString("afwezig"); 
       mededelingen = json.getJSONArray("mededelingen"); 
       mededeling = mededelingen.toString(); 


      }catch(JSONException e)  { 
       Log.e("log_tag", "Error parsing data "+e.toString()); 
      } 

     setContentView(R.layout.listplaceholder); 

      if(Integer.parseInt(minutenperlesuur) < 50){ 
      TextView verkortrooster = new TextView(this); 
      verkortrooster.setText("--- Het is "+minutenperlesuur+"min-rooster! --- "); 
      } 

      TextView statusdatum = new TextView(this); 
      statusdatum.setText("Dit is versie "+versie+" van "+datum+". \n"); 

      TextView afwezigt = new TextView(this); 
      afwezigt.setText("Afwezig:"); 

      TextView afwezigtextt = new TextView(this); 
      afwezigtextt.setText(afwezig+"\n"); 

      TextView mededelingent = new TextView(this); 
      mededelingent.setText("Mededelingen:"); 

      TextView mededelingentextt = new TextView(this); 
      mededelingentextt.setText(mededeling+"\n \n"); 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     menu.add(Menu.NONE, 0, 0, "Settings"); 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case 0: 
      startActivity(new Intent(this, Preferences.class)); 
      return true; 
     } 
     return false; 
    } 
} 

JSONfunctions.java:

public class JSONfunctions { 
    public static JSONObject getJSONfromURL(String url){ 
     InputStream is = null; 
     String result = ""; 
     JSONObject jArray = null; 

     //http post 
     try { 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(url); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 
     } catch(Exception e) { Log.e("log_tag", "Error in http connection" + e.toString()); } 


     //convert response to string 
     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 + "\n"); 
      } 
      is.close(); 
      result = sb.toString(); 
     } catch(Exception e) { Log.e("log_tag", "Error converting result" + e.toString()); } 

     try { jArray = new JSONObject(result); } 
     catch(JSONException e) { Log.e("log_tag", "Error parsing data "+e.toString()); } 

     return jArray; 
    } 
} 

файл манифеста:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="pws.sgdbroosterapp" 
     android:versionCode="1" 
     android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:configChanges="orientation|keyboardHidden" 
      android:screenOrientation="portrait" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".Roosterwijziging" 
      android:configChanges="orientation|keyboardHidden" 
      android:screenOrientation="portrait" > 
     </activity> 
     <activity 
      android:name=".RoosterWijzigingen" 
      android:configChanges="orientation|keyboardHidden" 
      android:screenOrientation="portrait" > 
     </activity> 
     <activity 
      android:name=".Preferences" 
      android:configChanges="orientation|keyboardHidden" 
      android:screenOrientation="portrait" > 
     </activity> 

     <uses-library 
       android:name="android.test.runner" 
       android:required="true" /> 
    </application> 
    <uses-permission android:name="android.permission.INTERNET" /> 
</manifest> 

Stacktrace:

01-05 15:12:49.995: E/log_tag(615): Error in http connection android.os.NetworkOnMainThreadException 
01-05 15:12:49.995: E/log_tag(615): Error converting result java.lang.NullPointerException 
01-05 15:12:49.995: E/log_tag(615): Error parsing data org.json.JSONException: End of input at character 0 of 
01-05 15:12:50.005: D/AndroidRuntime(615): Shutting down VM 
01-05 15:12:50.005: W/dalvikvm(615): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
01-05 15:12:50.015: E/AndroidRuntime(615): FATAL EXCEPTION: main 
01-05 15:12:50.015: E/AndroidRuntime(615): java.lang.RuntimeException: Unable to start activity ComponentInfo{pws.sgdbroosterapp/pws.sgdbroosterapp.RoosterWijzigingen}: java.lang.NullPointerException 
01-05 15:12:50.015: E/AndroidRuntime(615): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
01-05 15:12:50.015: E/AndroidRuntime(615): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
01-05 15:12:50.015: E/AndroidRuntime(615): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
01-05 15:12:50.015: E/AndroidRuntime(615): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
01-05 15:12:50.015: E/AndroidRuntime(615): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-05 15:12:50.015: E/AndroidRuntime(615): at android.os.Looper.loop(Looper.java:137) 
01-05 15:12:50.015: E/AndroidRuntime(615): at android.app.ActivityThread.main(ActivityThread.java:4745) 
01-05 15:12:50.015: E/AndroidRuntime(615): at java.lang.reflect.Method.invokeNative(Native Method) 
01-05 15:12:50.015: E/AndroidRuntime(615): at java.lang.reflect.Method.invoke(Method.java:511) 
01-05 15:12:50.015: E/AndroidRuntime(615): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
01-05 15:12:50.015: E/AndroidRuntime(615): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
01-05 15:12:50.015: E/AndroidRuntime(615): at dalvik.system.NativeStart.main(Native Method) 
01-05 15:12:50.015: E/AndroidRuntime(615): Caused by: java.lang.NullPointerException 
01-05 15:12:50.015: E/AndroidRuntime(615): at pws.sgdbroosterapp.RoosterWijzigingen.onCreate(RoosterWijzigingen.java:153) 
01-05 15:12:50.015: E/AndroidRuntime(615): at android.app.Activity.performCreate(Activity.java:5008) 
01-05 15:12:50.015: E/AndroidRuntime(615): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
01-05 15:12:50.015: E/AndroidRuntime(615): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
+0

попытку после изменения 'sb.append (линия + "\ п");' 'к sb.append (линии);' потому, что ваш JSON не является действительным –

ответ

2

Вы работаете HttpClient на главном потоке

android.os.NetworkOnMainThreadException 

Оберните ваш JSON вызов

JSONObject json = JSONfunctions.getJSONfromURL(URL); 

с AsyncTask, Somthing как это

new AsyncTask<Void, Void, Void>() { 

     @Override 
     protected Void doInBackground(Void... params) { 
      JSONObject json = JSONfunctions.getJSONfromURL(URL); 
      Log.v("Stackoverflow", json.toString()); 
      return null; 
     } 

    }.execute(); 

Не забудьте добавить доступ в Интернет разрешение

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 

С уважением

+0

Спасибо за ваш ответ! Я должен поместить код в свой пост в OnCreate вместо JSONObject json = JSONfunctions.getJSONfromURL (URL); правильно? Но если я использую JSONObject json где-то еще в коде, я получаю сообщение об ошибке «json не может быть разрешен». Может быть, это глупый вопрос, но что мне нужно сделать, чтобы исправить эту ошибку? – user1946633

+0

Я думаю, вы должны прочитать AsyncTask документ, но тем временем вы можете попробовать: \t \t новый AsyncTask <Пустота Пустота, String>() { \t \t \t @Override \t \t \t защищены Строка doInBackground (Пустота ... Титулы) { \t \t \t \t // Работает на собственном потоке \t \t \t \t JSONObject = JSONfunctions.getJSONfromURL JSON (URL); \t \t \t \t return json.toString(); \t \t \t} \t \t \t защищен недействительным onPostExecute (String результат) { \t \t \t \t // Работает на UI потоке \t \t \t \t Log.v ("Stackoverflow", результат); \t \t \t \t} .execute(); Также пропустите ваш новый код, чтобы получить точную помощь. – vsm

+0

В моем первом посте я редактировал код RoosterWijzigingen.java. Я совершенно новый для Android/Java, и я не могу найти то, что мне нужно включить в onPostExecute, чтобы я не получил ошибку для klassen = json.getJSONArray ("klassen"); и т. д. Может быть, вы можете взглянуть на меня, я очень ценю вашу помощь! – user1946633

0

Используйте separate thread, чтобы выполнить сетевой запрос по этой причине, получив ошибку. Для этого воспользуйтесь заданием asynchronous.

Ваша ошибка http connection android.os.NetworkOnMainThreadException

, чтобы решить эту проблему, создайте asynchronous class то на это doinbackground сделать запрос HTTP для JSON и postexecute метод обновления пользовательского интерфейса при необходимости.