2012-02-09 50 views
3

我是Android新手。我試圖做的是當我按下按鈕並在文本字段中寫入字符串時,通過Web服務獲取字符串。Android IllegalStateException:無法執行活動的方法

Manifext.xml:

<?xml version="1.0" encoding="utf-8"?> 

<uses-sdk android:minSdkVersion="15" /> 
<uses-permission android:name="android.permission.INTERNET"/> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".AndroidClientActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

main.xml中:

<?xml version="1.0" encoding="utf-8"?> 

<EditText 
    android:id="@+id/editText1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:inputType="text" > 

    <requestFocus /> 
</EditText> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onClick="myClickHandler" 
    android:text="Button" /> 
</LinearLayout> 

的strings.xml:

<?xml version="1.0" encoding="utf-8"?> 

<string name="hello">Hello World, AndroidClientActivity!</string> 
<string name="app_name">AndroidClient</string> 
<string name="button">Message</string> 
<string name="myClickHandler">myClickHandler</string> 

AndroidClientActivity.class:

package com.maze.client; 

import javax.ws.rs.core.MediaType; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 

import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.WebResource; 

public class AndroidClientActivity extends Activity { 

private EditText text; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    text = (EditText) findViewById(R.id.editText1); 
} 

public void myClickHandler(View view){ 
    switch (view.getId()) { 
    case R.id.button1: 

     WebResource wbr; 
     Client client = Client.create(); 
     wbr = client.resource("http://my.ip.address:8080/MazeService/rest/service/hello"); 
     String result = wbr.queryParam("number", "10").accept(MediaType.APPLICATION_JSON).get(String.class); 
      text.setText(result); 
     break; 
    } 

} 

}

這不起作用。我得到的logcat的這個錯誤(請幫我編輯右):

02-08 23:39:04.423: E/AndroidRuntime(660): FATAL EXCEPTION: main 
02-08 23:39:04.423: E/AndroidRuntime(660): java.lang.IllegalStateException: Could not execute method of the activity 
02-08 23:39:04.423: E/AndroidRuntime(660): at android.view.View$1.onClick(View.java:3044) 
02-08 23:39:04.423: E/AndroidRuntime(660): at android.view.View.performClick(View.java:3511) 
02-08 23:39:04.423: E/AndroidRuntime(660): at android.view.View$PerformClick.run(View.java:14105) 
02-08 23:39:04.423: E/AndroidRuntime(660): at android.os.Handler.handleCallback(Handler.java:605) 
02-08 23:39:04.423: E/AndroidRuntime(660): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-08 23:39:04.423: E/AndroidRuntime(660): at android.os.Looper.loop(Looper.java:137) 
02-08 23:39:04.423: E/AndroidRuntime(660): at android.app.ActivityThread.main(ActivityThread.java:4424) 
02-08 23:39:04.423: E/AndroidRuntime(660): at java.lang.reflect.Method.invokeNative(Native Method) 
02-08 23:39:04.423: E/AndroidRuntime(660): at java.lang.reflect.Method.invoke(Method.java:511) 
02-08 23:39:04.423: E/AndroidRuntime(660): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
02-08 23:39:04.423: E/AndroidRuntime(660): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
02-08 23:39:04.423: E/AndroidRuntime(660): at dalvik.system.NativeStart.main(Native Method) 
02-08 23:39:04.423: E/AndroidRuntime(660): Caused by: java.lang.reflect.InvocationTargetException 
02-08 23:39:04.423: E/AndroidRuntime(660): at java.lang.reflect.Method.invokeNative(Native Method) 
02-08 23:39:04.423: E/AndroidRuntime(660): at java.lang.reflect.Method.invoke(Method.java:511) 
02-08 23:39:04.423: E/AndroidRuntime(660): at android.view.View$1.onClick(View.java:3039) 
02-08 23:39:04.423: E/AndroidRuntime(660): ... 11 more 
02-08 23:39:04.423: E/AndroidRuntime(660): Caused by: com.sun.jersey.api.client.ClientHandlerException: android.os.NetworkOnMainThreadException 
02-08 23:39:04.423: E/AndroidRuntime(660): at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149) 
02-08 23:39:04.423: E/AndroidRuntime(660): at com.sun.jersey.api.client.Client.handle(Client.java:648) 
02-08 23:39:04.423: E/AndroidRuntime(660): at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670) 
02-08 23:39:04.423: E/AndroidRuntime(660): at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) 
02-08 23:39:04.423: E/AndroidRuntime(660): at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:503) 
02-08 23:39:04.423: E/AndroidRuntime(660): at com.maze.client.AndroidClientActivity.myClickHandler(AndroidClientActivity.java:32) 
02-08 23:39:04.423: E/AndroidRuntime(660): ... 14 more 
02-08 23:39:04.423: E/AndroidRuntime(660): Caused by: android.os.NetworkOnMainThreadException 
02-08 23:39:04.423: E/AndroidRuntime(660): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.io.IoBridge.connect(IoBridge.java:112) 
02-08 23:39:04.423: E/AndroidRuntime(660): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
02-08 23:39:04.423: E/AndroidRuntime(660): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
02-08 23:39:04.423: E/AndroidRuntime(660): at java.net.Socket.connect(Socket.java:842) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:77) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
02-08 23:39:04.423: E/AndroidRuntime(660): at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:479) 
02-08 23:39:04.423: E/AndroidRuntime(660): at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:240) 
02-08 23:39:04.423: E/AndroidRuntime(660): at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:147) 
02-08 23:39:04.423: E/AndroidRuntime(660): ... 19 more 
02-08 23:39:08.343: I/Process(660): Sending signal. PID: 660 SIG: 9 
+1

幫助我們來幫助你...格式化你的logcat。 – JoxTraex 2012-02-09 00:42:22

回答

17

在堆棧跟蹤埋是Caused by: com.sun.jersey.api.client.ClientHandlerException: android.os.NetworkOnMainThreadException在Android 3.x及,你不能做網絡I主/ O線程(這就是你想要做的)。您需要使用AsyncTask來完成網絡請求。

+0

謝謝,就是這一刻。然而,我面臨另一個問題:[請幫助](http://stackoverflow.com/questions/9204134/android-restful-client) – Dragos 2012-02-09 01:13:45

0

我有同樣的問題,併發瘋。 只有您必須在FIRST LINE中添加此代碼的onCreate方法才能拋出您的錯誤! (之前的super.onCreate):

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
+0

快速解決方法這可能聽起來不錯,但爲了讓你的應用程序離開黑暗的一面應該在不同的線程中執行資源密集型任務(如網絡操作)。 – kraxor 2013-11-02 08:13:21

相關問題