2011-11-08 61 views
0

我只是想处理来自我网站的安宁服务的响应,但每当我执行“httpResponse = httpclient.execute(httpget);”发生异常,我看不出它有什么问题,因为它是宁静的服务,是否有人知道下面的代码有什么问题?提前谢谢了。Android和Restful服务返回json文件?

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) 
+0

你有没有在AndroidManifest.xml上网权限? – Selvin

+3

提供堆栈跟踪。 –

+2

我们从这里看不到例外。 –

回答

0

此代码(用于发送HTTP 请求)就是我用了几次,它可能帮助你...

  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); 
+0

这不会帮助,异常意味着任何类型的网络操作不能发生在主线程上。 –

0

异常的名称告诉你你需要的一切:NetworkOnMainThreadException

你不应该在UI线程中做网络的东西,并且活动在那里运行。尝试使用线程或更好的AsyncTask来进行网络呼叫。

不要忘了你正在可能没有网络连接或非常慢的设备上创建应用程序。这可能会导致需要超过5秒(非常常见)的呼叫,并导致ANR(应用程序无响应)消息和无响应的应用程序。有关android page for responsiveness programming的更多信息。

1

如果您的目标是Honeycomb SDK或更高版本,则主线程上不允许执行网络操作。见here -

“当应用程序试图在其主线程中执行 联网操作时引发的异常这只是抛出 应用针对蜂窝SDK或更高”

使用AsyncTask类在后台运行长时间运行或网络任务。

迈克

0

编写应用程序标记上方互联网的权限,请参阅下面的代码<uses-permission android:name="android.permission.INTERNET" />

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" >