2013-04-12 2 views
0

Я использую API Google Directions для получения времени между местоположениями и Im, пытаясь получить данные из URL-адреса в объект JSON, чтобы я мог проанализировать его для данных, которые мне нужны. URL является:Android - Загрузите данные json из URL-адреса

http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=Joplin,MO|Oklahoma+City,OK&sensor=false

Я иду к этому URL с помощью намерения.

String url = "http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=Joplin,MO|Oklahoma+City,OK&sensor=false" 
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(url)); 
startActivity(intent); 

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

JSONObject durationObject = null; 
durationObject = jsonObject.getJSONObject("duration"); 

Я смотрел это вверх онлайн но все, что я пытаюсь, заканчивается сбоем или не работает. Ниже приведен код, который я пробовал, но не работает. Ничто не заканчивается тем, что записывается в результат String, потому что выполняется оператор if.

InputStream is = null; 
String result = ""; 
JSONObject jsonObject = null; 
try { 
    HttpClient httpclient = new DefaultHttpClient(); // for port 80 requests! 
    HttpPost httppost = new HttpPost(url); 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity entity = response.getEntity(); 
    is = entity.getContent(); 

    // Read response to string 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),1024); 
    StringBuilder sb = new StringBuilder(); 
    String line = ""; 
    while ((line = reader.readLine()) != null) { 
    sb.append(line + "\n"); 
    } 
    is.close(); 
    result = sb.toString(); 


    if (result.isEmpty()) { 
     result = "nothing"; 
     Toast msg = Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG); 
    msg.show(); 
    } 
// Convert string to object 

    jsonObject = new JSONObject(result); 

Это выход LogCat:

04-16 18:38:42.965: W/dalvikvm(9331): threadid=1: thread exiting with uncaught exception (group=0x40c371f8) 
04-16 18:38:42.975: E/AndroidRuntime(9331): FATAL EXCEPTION: main 
04-16 18:38:42.975: E/AndroidRuntime(9331): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: android.os.NetworkOnMainThreadException 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at android.app.ActivityThread.access$600(ActivityThread.java:127) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at android.os.Looper.loop(Looper.java:137) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at android.app.ActivityThread.main(ActivityThread.java:4507) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at dalvik.system.NativeStart.main(Native Method) 
04-16 18:38:42.975: E/AndroidRuntime(9331): Caused by: android.os.NetworkOnMainThreadException 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at java.net.InetAddress.getAllByName(InetAddress.java:220) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at com.example.test.MainActivity.onCreate(MainActivity.java:93) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at android.app.Activity.performCreate(Activity.java:4465) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932) 
04-16 18:38:42.975: E/AndroidRuntime(9331):  ... 11 more 

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

+0

Вы можете также разместить LogCat тоже. – daemon54

ответ

0

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

Что это означает, что основной поток отвечает за обновление пользовательского интерфейса, чтобы обеспечить плавный переход, если андроид обнаруживает, что вы выполняете какую-то длительную операцию, которая будет блокироваться, это заставит отключить приложение , чтобы вы знали, что это плохо.

Существует много альтернативных решений, таких как AsynTask или IntentService.

IntentService это услуга, которая работает, когда вы послали намерение к нему:

public class NetworkHandler extends IntentService { 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     //Do what Saeid Farivar is saying here 
    } 
} 

Чтобы активировать IntentService, просто сделать:

Intent intent = new Intent(mContext, NetworkHandler.class); 
startService(intent); 
+0

спасибо за объяснение проблемы и предоставление альтернативных решений. Я использовал asynctask и реализовал запрос/синтаксический анализ json в функции doInBackground, и он работал нормально. – homes

0

Это рабочий код, который я использую

private DefaultHttpClient httpclient = new DefaultHttpClient(); 

    public JSONObject getObjectInfo(String requestURL) throws Exception { 

    JSONObject responseObject = null; 
    Log.d(getClass().getSimpleName(), "HttpClient: getObjectInfo: " 
      + requestURL); 
    HttpGet httpget = new HttpGet(requestURL); 
    HttpResponse response; 
    try { 
     response = httpclient.execute(httpget); 
     HttpEntity entity = response.getEntity(); 
     Log.d(getClass().getSimpleName(), "HttpClient: getObjectInfo: " 
       + "respondreceived"); 
     if (entity != null) { 
      InputStream instream = entity.getContent(); 
      Log.d("httpclient", 
        "HttpClient: getObjectInfo: converting to string"); 
      String jsonObjectString = Conversion 
        .convertStreamToString(instream); 

      try { 
       responseObject = new JSONObject(jsonObjectString); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e1) { 
     e1.printStackTrace(); 
    } finally { 

    } 
    return responseObject; 
} 

метод для преобразования потока в строку:

public static String convertStreamToString(java.io.InputStream is) { 

    try { 
     return new java.util.Scanner(is).useDelimiter("\\A").next(); 
    } catch (java.util.NoSuchElementException e) { 
     return ""; 
    } 
} 

Сказать, что я бы предложил использовать библиотеку Яксон создать класс из полученный объект json. here - пример использования библиотеки Jakson.

+0

Я тоже пробовал ваш код, но то же самое происходит. Приложение падает, и я думаю, что это из-за строгого режима, блокирующего основной поток. – homes

+0

Попробуйте прокомментировать «код намерения», жесткий код url google api и проверьте, не получает ли url данные. Также проверьте, что вы приняли разрешение на доступ в интернет в manifest.ini или нет. –

+0

@homes check out [this] (http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) для сетевого материала в основной теме. –