2013-09-05 3 views
0

В настоящее время я работаю над приложением, которое должно потреблять очень большое количество данных JSON, и у меня возникает проблема с использованием парсера Jackson для этого. У меня есть следующий код в моем классе, где мне нужно, чтобы разобрать данные:Android-приложение Parsing JSON Ошибка данных?

HttpRequest request = HttpRequest.get("http://www.site.com/android/app/getAllUsers.php"); 

final Reader reader = request.reader(); 
final ObjectMapper mapper = new ObjectMapper(); 
final JsonFactory factory = mapper.getFactory(); 


class LoadAllUsers extends AsyncTask<String, String, String> { 

     /** 
     * Before starting background thread Show Progress Dialog 
     * */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(VenuesListActivity.this); 
      pDialog.setMessage("Loading Users. Please wait..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     /** 
     * getting All products from url 
     * */ 
     protected String doInBackground(String... args) { 

      try { 
       JsonParser jp = factory.createParser(reader); 

       while(jp.nextToken() == JsonToken.START_OBJECT) { 

        final User a = mapper.readValue(jp, User.class); 

        String fieldName = jp.getCurrentName(); 

        if("users".equals(fieldName)) 
        { 

         jp.nextToken(); 

         while(jp.nextToken() != JsonToken.END_ARRAY) 
         { 

          // creating new HashMap 
          HashMap<String, String> map = new HashMap<String, String>(); 

          // adding each child node to HashMap key => value 
          map.put(TAG_ID, a.ID); 
          map.put(TAG_DATA2, a.data1); 
          map.put(TAG_DATA3, a.data2); 
          ... 

          // adding HashList to ArrayList 
          usersList.add(map); 

         } 

        } 

       } 
      } catch (JsonParseException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 

      return null; 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * **/ 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog after getting all venues 
      pDialog.dismiss(); 
      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 
        /** 
        * Updating parsed JSON data into ListView 
        * */      
        setListAdapter(adapter); 
       } 
      }); 

     } 

    } 

Тогда я установки в Pojo в одном классе, как показано ниже:

public class User { 

    String ID; 
    String data1; 
    String data2; 
    ... 

    public String getID() { 
     return ID; 
    } 
    public void setID(String iD) { 
     ID = iD; 
    } 
    public String getData1() { 
     return data1; 
    } 
    public void setData1(String data1) { 
     this.data1 = data1; 
    } 
    public String getData2() { 
     return data2; 
    } 
    public void setData2(String data2) { 
     this.data2 = data2; 
    } 
    ... 

} 

Ниже я прилагаю мой PHP-файл который собирает данные из моей базы данных для передачи при вызове:

<?php 

// array for JSON response $response = array(); // include db connect class require_once __DIR__ . '/dbConnect.php'; // connecting to db $db = new DB_CONNECT(); // get all users from users table $result = mysql_query("SELECT * FROM accounts") or die(mysql_error()); // check for empty result if (mysql_num_rows($result) > 0) { 
    // looping through all results 
    // users node 
    $response["users"] = array(); 

    while ($row = mysql_fetch_array($result)) { 
     // temp user array 
     $venue = array(); 
     $venue["ID"] = $row["ID"]; 
     $venue["data1"] = $row["data1"]; 
     $venue["data2"] = $row["data2"];   
     ... 

     // push single user into final response array 
     array_push($response["users"], $venue); 
    } 
    // success 
    $response["success"] = 1; 

    // echoing JSON response 
    echo json_encode($response); } else { 
    // no users found 
    $response["success"] = 0; 
    $response["message"] = "No users found"; 

    // echo no users JSON 
    echo json_encode($response); } ?> 

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

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.app.accs/com.app.accs.UsersListActivity}: android.os.NetworkOnMainThreadException 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297) 
at android.app.ActivityThread.access$700(ActivityThread.java:152) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5328) 
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:1102) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.os.NetworkOnMainThreadException 
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1125) 
at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
at java.net.InetAddress.getAllByName(InetAddress.java:214) 
at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) 
at libcore.net.http.HttpEngine.connect(HttpEngine.java:311) 
at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 
at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282) 
at libcore.net.http.HttpURLConnectionImpl.getHeaderField(HttpURLConnectionImpl.java:139) 
at com.github.kevinsawicki.http.HttpRequest.header(HttpRequest.java:2025) 
at com.github.kevinsawicki.http.HttpRequest.parameter(HttpRequest.java:2120) 
at com.github.kevinsawicki.http.HttpRequest.charset(HttpRequest.java:2230) 
at com.github.kevinsawicki.http.HttpRequest.reader(HttpRequest.java:1822) 
at com.app.accs.UsersListActivity.<init>(UsersListActivity.java:107) 
at java.lang.Class.newInstanceImpl(Native Method) 
at java.lang.Class.newInstance(Class.java:1319) 
at android.app.Instrumentation.newActivity(Instrumentation.java:1071) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2164) 

Я надеюсь, что кто-то может мне помочь, поскольку файл JSON может содержать массив из 15 000 пользовательских записей, и я хотел использовать этот потоковый процесс для повышения производительности. Я также не уверен, но это может иметь что-то делать с целевой SDK, поэтому ниже немного больше информации о приложении:

android:minSdkVersion="11" 
android:targetSdkVersion="17" 

Спасибо заранее.


** * *EDIT* ** * *


Привет спасибо за ответы, и я искал в этом немного дальше и да, эта задача ASync выполняется из MainUI (onCreate) следующий код ниже:

if(user == null || user.equals("All")){ 

    // Loading users in Background Thread 
    new LoadAllUsers().execute(); 

}else{ 
     // Load something else 
} 

Это в основном смотрит на куске данных, передаваемый с этой точкой зрения под названием «пользователь», и если объект пользователя пуст или имеет значение «Все», то я исполню LoadAllUsers Задача ASync. Если я не могу выполнить его из основного пользовательского интерфейса, как это сделать, используя данные, переданные в это представление?

Спасибо за помощь

+0

Пожалуйста, приложите полный код в файле 'VenuesListActivity.java', и мы решим вашу проблему. Спасибо. –

+0

Извините, это была ошибка с моей стороны, как и пришлось скопировать код ошибки по строке из-за проблемы с vm и были замешаны, поэтому VenuesListActivity.java должен быть UsersListActivity.java – user723858

ответ

0

Изменение этой строки кода:

class LoadAllUsers extends AsyncTask<String, String, String> { 

    /** 
    * Before starting background thread Show Progress Dialog 
    * */ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(UsersListActivity.this); 
     ...... 
    } 
...... 


Наряду с этим, не делают сетевые вызовы на UI тему и сделать индивидуальный Async Classes или Services для выполнения всех задач, связанных с сетью вызовов.

2

в Caused by: android.os.NetworkOnMainThreadException, что вы видите в этом докладе аварии указывает вам на то, что вы делаете это в основном потоке пользовательского интерфейса .. нет сети не разрешено, так это убивает его. обратите внимание на правильное использование AsycTasks.

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

, пожалуйста, отредактируйте свой вопрос, чтобы указать (или указать), что у вас есть на VenuesListActivity.java:107, так как это также указывает отчет о сбое.

+0

Я думаю, что запрос HttpRequest = HttpRequest.get ("http://www.site.com/android/app/getAllUsers.php"); '- это 187-я строка кода. –

+0

107 not 187 :-) – MrTristan

+0

haha, я просто думал об этом: P –

0

Как и MrTristan, вы выполняете сетевую задачу на UI Thread. Сетевые задачи, как правило, длинные, поэтому Android требует, чтобы вы делали их на фоне Thread. Ваш код, похоже, использует AsyncTask для анализа данных JSON, но не для выполнения сетевой задачи.Кроме того, вам не нужно использовать runOnUiThread() на onPostExecute(), потому что onPostExecute() уже работает на UI Thread.

+0

Честно говоря, я последовал за учебником по задаче aSync, который показал, как его реализовать, можете ли вы предложить любые другие ресурсы, которые я могу использовать вместо этого реализовать то, что я хочу достичь? Спасибо – user723858

+0

Здесь вы идете http://stackoverflow.com/questions/13196234/simple-parse-json-from-url-on-android – Emmanuel

+0

Привет, я обновил свой пост, можете ли вы помочь с этим? Спасибо – user723858

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