2015-07-14 2 views
0

Я начал изучать Android неделю назад и решил написать простое приложение для Android для сайта bhooka.in. Я использовал koush/ion api для извлечения json-данных из url.Извлечение и анализ JSON из нескольких URL-адресов и добавление в список

В этом случае проблема заключается в том, что у меня есть один файл JSON, содержащий несколько URL-адресов JSON. Теперь я попытался получить все JSON в цикле for, но это, похоже, не работает. Вот код:

Future<JsonObject> loading; 

private void load() { 
    // don't attempt to load more if a load is already in progress 
    if (loading != null && !loading.isDone() && !loading.isCancelled()) 
     return; 

    // load the tweets 
    String url = "http://bhooka.in/web_services_json_helper.php?mode=fetch_locations&user_agent=in.bhooka.bhooka&city_id=4"; 
    loading = Ion.with(this) 
      .load(url) 
      .asJsonObject() 
      .setCallback(new FutureCallback<JsonObject>() { 
       @Override 
       public void onCompleted(Exception e, JsonObject result) { 
        // this is called back onto the ui thread, no Activity.runOnUiThread or Handler.post necessary. 
        if (e != null) { 
         Toast.makeText(getView().getContext(), "Error loading information", Toast.LENGTH_LONG).show(); 
         return; 
        } 
        JsonArray locationsList = result.getAsJsonArray("locations"); 
        // add the tweets 
        for (int i = 0; i < locationsList.size(); i++) { 
         try { 
          JsonObject temp = Ion.with(getView().getContext()) 
            .load("http://bhooka.in/web_services_json_helper.php?mode=fetch_loc_info&user_agent=in.bhooka.bhooka&loc_id=" + locationsList.get(i).getAsJsonObject().get("post_id").getAsString()) 
            .asJsonObject().get(); 
          placeArrayAdapter.add(temp.get("loc_info").getAsJsonObject()); 
         } 
         catch (Exception ex) 
         { 
          ex.printStackTrace(); 
         } 

           /* tried this approach - but it doesn't work 
           .setCallback(new FutureCallback<JsonObject>() { 
            @Override 
            public void onCompleted(Exception e, JsonObject result) { 
             // this is called back onto the ui thread, no Activity.runOnUiThread or Handler.post necessary. 
             if (e != null) { 
              Toast.makeText(getView().getContext(), "Error loading information", Toast.LENGTH_LONG).show(); 
              return; 
             } 
             placeArrayAdapter.add(result.get("loc_info").getAsJsonObject()); 
            } 
           });*/ 
        } 
       } 
      }); 
} 

Приложение открывается, а затем просто замерзает. Я также пробовал асинхронный подход с использованием обратных вызовов, но он просто отображает одну или две записи в списке, а затем сбой. Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно?

Большое спасибо.

EDIT: Как было предложено, вот LogCat:

07-14 17:02:11.851 20332-20332/? D/dalvikvm﹕ Late-enabling CheckJNI 
07-14 17:02:11.867 20332-20338/? D/dalvikvm﹕ Debugger has detached; object registry had 1 entries 
07-14 17:02:12.206 20332-20332/? I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018_msm8610_LNX.LA.3.5.1_RB1__release_AU() 
    OpenGL ES Shader Compiler Version: E031.24.00.08 
    Build Date: 03/07/14 Fri 
    Local Branch: 
    Remote Branch: quic/LNX.LA.3.5.1_RB1.1 
    Local Patches: NONE 
    Reconstruct Branch: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 + NOTHING 
07-14 17:02:12.244 20332-20332/? D/OpenGLRenderer﹕ Enabling debug mode 0 
07-14 17:02:14.469 20332-20364/in.bhooka.bhooka D/dalvikvm﹕ Trying to load lib /data/app-lib/in.bhooka.bhooka-2/libgmscore.so 0x41d995f0 
07-14 17:02:14.470 20332-20364/in.bhooka.bhooka E/dalvikvm﹕ dlopen("/data/app-lib/in.bhooka.bhooka-2/libgmscore.so") failed: dlopen failed: library "/data/app-lib/in.bhooka.bhooka-2/libgmscore.so" not found 
07-14 17:02:14.470 20332-20364/in.bhooka.bhooka E/ProviderInstaller﹕ Unable to load native code from /data/app-lib/in.bhooka.bhooka-2/libgmscore.so 
07-14 17:02:14.470 20332-20364/in.bhooka.bhooka D/dalvikvm﹕ Trying to load lib /data/app-lib/com.google.android.gms-2/libgmscore.so 0x41d995f0 
07-14 17:02:14.472 20332-20364/in.bhooka.bhooka D/dalvikvm﹕ Added shared lib /data/app-lib/com.google.android.gms-2/libgmscore.so 0x41d995f0 
07-14 17:02:14.472 20332-20364/in.bhooka.bhooka D/dalvikvm﹕ No JNI_OnLoad found in /data/app-lib/com.google.android.gms-2/libgmscore.so 0x41d995f0, skipping init 
07-14 17:02:14.474 20332-20364/in.bhooka.bhooka E/ProviderInstaller﹕ libgmscore version mismatch (0 vs. 7574) 
07-14 17:02:14.474 20332-20364/in.bhooka.bhooka W/IonConscrypt﹕ Conscrypt initialization failed. 
07-14 17:02:44.955 20332-20364/in.bhooka.bhooka D/dalvikvm﹕ GC_FOR_ALLOC freed 3066K, 29% free 7930K/11072K, paused 37ms, total 47ms 
07-14 17:02:45.008 20332-20332/in.bhooka.bhooka D/AndroidRuntime﹕ Shutting down VM 
07-14 17:02:45.008 20332-20332/in.bhooka.bhooka W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x415dad40) 
07-14 17:02:45.010 20332-20332/in.bhooka.bhooka E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: in.bhooka.bhooka, PID: 20332 
    java.lang.NullPointerException 
      at in.bhooka.bhooka.MainActivity$1.onCompleted(MainActivity.java:73) 
      at in.bhooka.bhooka.MainActivity$1.onCompleted(MainActivity.java:67) 
      at com.koushikdutta.async.future.SimpleFuture.handleCallbackUnlocked(SimpleFuture.java:107) 
      at com.koushikdutta.async.future.SimpleFuture.setComplete(SimpleFuture.java:141) 
      at com.koushikdutta.async.future.SimpleFuture.setComplete(SimpleFuture.java:124) 
      at com.koushikdutta.ion.IonRequestBuilder$1.run(IonRequestBuilder.java:244) 
      at com.koushikdutta.async.AsyncServer$RunnableWrapper.run(AsyncServer.java:57) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5086) 
      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:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 
+0

В обратном вызове используется ГЮТ() (Ion, with() ..... get()), который блокирует. Может, это твоя проблема? –

+1

Убедитесь, что вы выполняете всю свою связанную с сетью задачу в фоновом потоке (например, Asyntasks). Также опубликуйте свой журнал –

+0

@RoiDivon, как я уже упоминал, я тоже пробовал этот подход, функция генерирует исключение, как показано в logcat – technusm1

ответ

0

использовать вместо переоснащения и Джексоном конвертер, чтобы получить места. Это действительно просто ваш код, так как код действительно сложный. Это лучшая комбинация для обработки URL-адресов.

0

Если вы хотите добавить элементы в ListView/adapter, вы должны сделать это в основной теме. Вы можете использовать Handler для этого:

В главной резьбе

Handler handler = new Handler(); 

И когда вам нужно выполнить что-то на главной резьбе

handler.post(new Runnable() { 
    @Override 
    public void run() { 
     placeArrayAdapter.add(temp.get("loc_info").getAsJsonObject()); 
    } 
}