2011-11-08 59 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" >