Android的 - 从以下网址下载中心JSON数据 [英] Android - Dowload json data from URL

查看:122
本文介绍了Android的 - 从以下网址下载中心JSON数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用IM的谷歌地图API来获取到的位置和我试着从URL数据放在一个JSON对象,这样我可以分析它,我需要的数据之间的时间。网址是:

Im using the Google Directions API to get the time between to locations and Im trying to get the data from a URL into a JSON object so that I can parse it for the data I need. The URL is:

<一个href=\"http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=Joplin,MO|Oklahoma+City,OK&sensor=false\" rel=\"nofollow\">http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=Joplin,MO|Oklahoma+City,OK&sensor=false

我去这个网址使用意向。

I go to this URL using an intent.

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对象,这样我可以得到我所需要使用的任何数据:

This brings up json data in the browser and I would like to put it into a json object so that I can get whatever data I need using:

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

我在网上看这件事,但一切我尝试最终崩溃或无法正常工作。
下面是一些code我都试过,但不起作用。没有什么最终被写入字符串的结果,因为if语句执行。

I have looked this up online but everything I try ends up crashing or not working. Below is some code I have tried but does not work. Nothing ends up being written to String result because the if statement executes.

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的输出:

This is the logcat output:

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

我一直在寻找到它,它似乎它是与要启用的严格模式。关于如何解决这个问题的任何帮助将是巨大的。

I was looking into it and it seems it has something to do with the strict mode being enabled. Any help on how to fix this problem would be great.

推荐答案

这是怎么发生的事情是常有的事,你想你的应用程序的主线程上执行一些长期运行的操作。

What is happening here is common, you are trying to perform some long running operation on the main thread of your application.

这意味着什么,是主线程负责更新UI,执行一个流畅的体验,如果机器人检测到你正在做一些将被阻塞长时间运行的操作,它会强制关闭应用程序,让你知道这是不好的。

What that means, is that the main thread is in charge of updating the UI, to enforce a smooth experience, if android detects you are doing some long running operation that is going to be blocking, it will force shutdown the app, to let you know that this is bad.

有许多可替代的解决方案,如AsynTask,或IntentService

There are many alternative solution, such as AsynTask, or IntentService.

IntentService是运行时对发送的意图它是一个服务:

IntentService is a service that runs when you sent a intent to it:

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

要激活IntentService,简单地做:

To activate the IntentService, simply do:

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

这篇关于Android的 - 从以下网址下载中心JSON数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆