【问题标题】:android connecting to json/xml apiandroid 连接到 json/xml api
【发布时间】:2011-11-22 16:42:12
【问题描述】:

我正在尝试与 rest api 通信以检索 JSON 文档,但是当我在 Eclipse Android 模拟器中运行应用程序时,应用程序一启动就关闭(“不幸的是,TestRest 已停止”)。由于调用了 httpClient.execute 方法,它似乎关闭了。

主要活动的代码如下:

public class TestRestActivity extends Activity {
    /** Called when the activity is first created. */
    TextView info;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        info = (TextView) findViewById(R.id.debug);

        String testUri = "http://www.entireweb.com/xmlquery?pz=MYAPIKEY&ip=IP&q=pizza&n=50&format=json";
        // print the uri to the screen - (not seen if rest of code runs)
        info.setText(testUri);

        HttpClient httpclient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpGet httpget = new HttpGet(testUri);


        HttpResponse response = null;
        try {
            // TODO fails on this line
            response = httpclient.execute(httpget, localContext);

            HttpEntity entity = response.getEntity();
            if (entity != null) {
                info.setText("got it");
            }

        } catch (ClientProtocolException e) {
            // Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // Auto-generated catch block
            e.printStackTrace();
        } finally {
        }

    }
}

我还在清单文件中包含了网络权限,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.john.testRes"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="android.permission.INTERNET" />

对 Android 开发不太熟悉,对导致问题的原因一无所知。我正在使用的 api 很好,可以从我的浏览器返回预期的 json 文档。我正在使用的 AVD 可以在其浏览器中连接到互联网,我已经在几个不同的 AVD 上尝试了该应用程序。

关于导致问题的原因有什么建议吗?谢谢。

编辑:添加错误

11-22 18:13:14.221: D/AndroidRuntime(556): Shutting down VM
11-22 18:13:14.221: W/dalvikvm(556): threadid=1: thread exiting with uncaught exception (group=0x409951f8)
11-22 18:13:14.251: E/AndroidRuntime(556): FATAL EXCEPTION: main
11-22 18:13:14.251: E/AndroidRuntime(556): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.john.testRes/org.john.testRes.TestRestActivity}: android.os.NetworkOnMainThreadException
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.os.Looper.loop(Looper.java:137)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread.main(ActivityThread.java:4340)
11-22 18:13:14.251: E/AndroidRuntime(556):  at java.lang.reflect.Method.invokeNative(Native Method)
11-22 18:13:14.251: E/AndroidRuntime(556):  at java.lang.reflect.Method.invoke(Method.java:511)
11-22 18:13:14.251: E/AndroidRuntime(556):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-22 18:13:14.251: E/AndroidRuntime(556):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-22 18:13:14.251: E/AndroidRuntime(556):  at dalvik.system.NativeStart.main(Native Method)
11-22 18:13:14.251: E/AndroidRuntime(556): Caused by: android.os.NetworkOnMainThreadException
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
11-22 18:13:14.251: E/AndroidRuntime(556):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
11-22 18:13:14.251: E/AndroidRuntime(556):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
11-22 18:13:14.251: E/AndroidRuntime(556):  at java.net.InetAddress.getAllByName(InetAddress.java:220)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.john.testRes.TestRestActivity.onCreate(TestRestActivity.java:41)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.Activity.performCreate(Activity.java:4465)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
11-22 18:13:14.251: E/AndroidRuntime(556):  ... 11 more
11-22 18:13:48.321: I/Process(556): Sending signal. PID: 556 SIG: 9
11-22 18:14:01.552: D/AndroidRuntime(597): Shutting down VM

【问题讨论】:

  • 请添加您从 logCat 获得的异常的堆栈跟踪
  • 没有日志几乎不可能弄清楚,但无论如何,你不应该在主线程中进行网络调用。考虑使用AsyncTasks
  • 我同意 dmon。你不应该在 UI(事件)线程中进行网络调用。检查我今天发布的在 asynctasks 中做网络线程的答案stackoverflow.com/questions/8224993/…
  • 感谢您的反馈。我在上面添加了堆栈跟踪。它的原因是:android.os.NetworkOnMainThreadException 所以一定是它。将查看提供的链接。再次感谢。

标签: android json api http


【解决方案1】:

问题是您试图在主 UI 线程上执行网络操作。您需要在单独的线程上执行这些操作。您可以使用AsyncTask 或仅使用标准Thread

这是一个简单的例子:

final Handler handler = new Handler();
new Thread(new Runnable() {

     @Override
     public void run() {
          // Do something long running
          handler.post(new Runnable() {

               @Override
               public void run() {
                    // Do something on the UI Thread
               }
          });
     }
}).start();

【讨论】:

  • 感谢您的回答,我最终使用了 AsyncTask。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2015-09-10
相关资源
最近更新 更多