Службы Android и Restful возвращают файл json? - PullRequest
0 голосов
/ 08 ноября 2011

Я просто пытаюсь обработать ответ от службы покоя моего сайта, но всякий раз, когда я выполняю "httpResponse = httpclient .execute (httpget);" Возникла исключительная ситуация, и я не вижу, что с ней не так, поскольку это спокойный сервис. Кто-нибудь знает, в чем проблема со следующим кодом? заранее большое спасибо.

package com.android.hummedia;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.R.string;
import android.app.Activity;
import android.content.Entity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class searchResultList extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.result);
        int responseCode;
        String message;

        String query = "http://hummedia.byu.edu/mediainfo/search/?title=Harry";

        Button testButton = (Button) findViewById(R.id.test);
        testButton.setOnClickListener(new View.OnClickListener() {

          @Override
    public void onClick(View view) {
            Intent intent = new Intent(searchResultList.this, HummediaActivity.class);
            startActivity(intent);
          }
        });

        HttpClient httpclient  = new DefaultHttpClient();
        HttpGet httpget  = new HttpGet(query);
        HttpResponse httpResponse;


        try {
            httpResponse = httpclient .execute(httpget);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

        }

    protected void onResume() {
         super.onResume();
     } 
}

Вот трассировка стека, найденная в logCat, спасибо:

11-08 10:30:02.944: W/System.err(646): android.os.NetworkOnMainThreadException
11-08 10:30:02.964: W/System.err(646):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
11-08 10:30:02.974: W/System.err(646):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
11-08 10:30:02.984: W/System.err(646):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
11-08 10:30:03.004: W/System.err(646):  at java.net.InetAddress.getAllByName(InetAddress.java:220)
11-08 10:30:03.014: W/System.err(646):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
11-08 10:30:03.024: W/System.err(646):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
11-08 10:30:03.045: W/System.err(646):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
11-08 10:30:03.054: W/System.err(646):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
11-08 10:30:03.064: W/System.err(646):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
11-08 10:30:03.074: W/System.err(646):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
11-08 10:30:03.084: W/System.err(646):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
11-08 10:30:03.104: W/System.err(646):  at com.android.hummedia.searchResultList.onCreate(searchResultList.java:70)
11-08 10:30:03.114: W/System.err(646):  at android.app.Activity.performCreate(Activity.java:4465)
11-08 10:30:03.174: W/System.err(646):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
11-08 10:30:03.184: W/System.err(646):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
11-08 10:30:03.194: W/System.err(646):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
11-08 10:30:03.215: W/System.err(646):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
11-08 10:30:03.224: W/System.err(646):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
11-08 10:30:03.234: W/System.err(646):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-08 10:30:03.244: W/System.err(646):  at android.os.Looper.loop(Looper.java:137)
11-08 10:30:03.254: W/System.err(646):  at android.app.ActivityThread.main(ActivityThread.java:4340)
11-08 10:30:03.264: W/System.err(646):  at java.lang.reflect.Method.invokeNative(Native Method)
11-08 10:30:03.274: W/System.err(646):  at java.lang.reflect.Method.invoke(Method.java:511)
11-08 10:30:03.284: W/System.err(646):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-08 10:30:03.294: W/System.err(646):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-08 10:30:03.306: W/System.err(646):  at dalvik.system.NativeStart.main(Native Method)

Ответы [ 4 ]

1 голос
/ 08 ноября 2011

если вы нацелены на Honeycomb SDK или выше, сетевые операции запрещены в главном потоке. См. здесь -

"Исключение, которое выдается, когда приложение пытается выполнить сетевая операция в главном потоке. Это только брошено для приложения, ориентированные на Honeycomb SDK или выше "

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

Mike

0 голосов
/ 07 февраля 2013

Напишите интернет-разрешение над тегом приложения, см. Ниже код <uses-permission android:name="android.permission.INTERNET" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
0 голосов
/ 08 ноября 2011

Имя исключения говорит вам обо всем, что вам нужно: NetworkOnMainThreadException

Вы не должны выполнять сетевые операции в потоке пользовательского интерфейса, и действие выполняется там.Попробуйте использовать поток или лучше AsyncTask для сетевых вызовов.

Не забывайте, что вы создаете приложение на устройстве, которое может не иметь доступного сетевого подключения или очень медленное.Это может привести к вызову, который требует более 5 секунд (очень часто) и приведет к сообщению ANR (приложение не отвечает) и к приложению без ответа.Больше информации на странице android для программирования отзывчивости .

0 голосов
/ 08 ноября 2011

Этот код (используется для отправки http post запросов) - это то, что я использовал несколько раз, он может помочь вам ...

            HttpClient httpclient = new DefaultHttpClient();

            HttpPost httppost = new HttpPost("http://mysite.com");
            ArrayList<NameValuePair> data = new ArrayList<NameValuePair>(2);
            data.add(new BasicNameValuePair("name", "value"));
            data.add(new BasicNameValuePair("name", "value"));
            data.add(new BasicNameValuePair("key", "value"));
            httppost.setEntity(new UrlEncodedFormEntity(data));
            HttpResponse response = httpclient.execute(httppost);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...