为什么我无法执行的活动越来越java.lang.IllegalStateException的方法是什么? [英] Why I could not execute method of the activity getting java.lang.IllegalStateException?
问题描述
我已经创建新的项目。
新增权限AndroidManifex
<使用许可权的android:NAME =android.permission.INTERNET对/>
涂改MainActivity:
包com.example.app;进口android.support.v7.app.ActionBarActivity;
进口android.os.Bundle;进口org.apache.http.client.HttpClient;
进口org.apache.http.client.methods.HttpGet;
进口org.apache.http.impl.client.DefaultHttpClient;进口java.io.IOException异常;公共类MainActivity扩展ActionBarActivity {
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main); 连接();
} 私人无效连接(查看视图){
HttpClient的客户端=新DefaultHttpClient();
HTTPGET请求=新HTTPGET(HTTP://www.mywebsite.com / ...);
尝试{
client.execute(请求);
}赶上(IOException异常五){
e.printStackTrace();
}
}
}
这是我的布局:
<的FrameLayout的xmlns:机器人=http://schemas.android.com/apk/res/android
的xmlns:工具=http://schemas.android.com/tools
机器人:ID =@ + ID /容器
机器人:layout_width =match_parent
机器人:layout_height =match_parent
工具:上下文=。MainActivity
工具:忽略=MergeRootFrame> <按钮
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:文字=HTTPGET
安卓的onClick =连接/>< /&的FrameLayout GT;
但是,当我按下按钮,我只是得到:
java.lang.IllegalStateException:无法执行活动的方法
在android.view.View $ 1.onClick(View.java:3660)
在android.view.View.performClick(View.java:4162)
在android.view.View $ PerformClick.run(View.java:17082)
在android.os.Handler.handleCallback(Handler.java:615)
在android.os.Handler.dispatchMessage(Handler.java:92)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:4856)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1007)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
在dalvik.system.NativeStart.main(本机方法)
java.lang.reflect.InvocationTargetException:产生的原因
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:511)
在android.view.View $ 1.onClick(View.java:3655)
在android.view.View.performClick(View.java:4162)
在android.view.View $ PerformClick.run(View.java:17082)
在android.os.Handler.handleCallback(Handler.java:615)
在android.os.Handler.dispatchMessage(Handler.java:92)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:4856)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1007)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
在dalvik.system.NativeStart.main(本机方法)
android.os.NetworkOnMainThreadException:产生的原因
在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
在java.net.InetAddress.lookupHostByName(InetAddress.java:385)
在java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
在java.net.InetAddress.getAllByName(InetAddress.java:214)
在org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
在org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
在org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
在org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
在com.example.app.MainActivity.connect(MainActivity.java:24)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:511)
在android.view.View $ 1.onClick(View.java:3655)
在android.view.View.performClick(View.java:4162)
在android.view.View $ PerformClick.run(View.java:17082)
在android.os.Handler.handleCallback(Handler.java:615)
在android.os.Handler.dispatchMessage(Handler.java:92)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:4856)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1007)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
在dalvik.system.NativeStart.main(本机方法)
更改为
公共无效连接(视图v){//错过查看参数
<一个href=\"http://developer.android.com/reference/android/view/View.html#attr_android:onClick\">http://developer.android.com/reference/android/view/View.html#attr_android:onClick
例如,如果您指定安卓的onClick =sayHello的
,您必须声明公共无效的sayHello(视图V)
上下文的方法(通常情况下,你的活动)。
和删除
连接(); //中的onCreate
UI线程同时正在运行的网络相关操作。你需要使用线程
或的AsyncTask
例如:
公共无效连接(视图v){
新TheTask()执行();
}
类TheTask扩展的AsyncTask&LT;太虚,太虚,太虚&GT;
{
@覆盖
保护无效doInBackground(虚空...... PARAMS){
HttpClient的客户端=新DefaultHttpClient();
HTTPGET请求=新HTTPGET(http://www.yiinotes.com/nutrimondo/web/meals/week);
尝试{
client.execute(请求);
}赶上(IOException异常五){
e.printStackTrace();
}
返回null;
}
}
I've create new project. Added permissions to AndroidManifex
<uses-permission android:name="android.permission.INTERNET" />
Altered MainActivity:
package com.example.app;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.IOException;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connect();
}
private void connect(View view) {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://www.mywebsite.com/...");
try {
client.execute(request);
} catch (IOException e) {
e.printStackTrace();
}
}
}
This is my layout:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
tools:ignore="MergeRootFrame">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HttpGet"
android:onClick="connect" />
</FrameLayout>
But when I push the button I simply get:
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:3660)
at android.view.View.performClick(View.java:4162)
at android.view.View$PerformClick.run(View.java:17082)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4856)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at android.view.View$1.onClick(View.java:3655)
at android.view.View.performClick(View.java:4162)
at android.view.View$PerformClick.run(View.java:17082)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4856)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
at java.net.InetAddress.getAllByName(InetAddress.java:214)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at com.example.app.MainActivity.connect(MainActivity.java:24)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at android.view.View$1.onClick(View.java:3655)
at android.view.View.performClick(View.java:4162)
at android.view.View$PerformClick.run(View.java:17082)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4856)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
Change to
public void connect(View v) { // missed View as param
http://developer.android.com/reference/android/view/View.html#attr_android:onClick
For instance, if you specify android:onClick="sayHello"
, you must declare a public void sayHello(View v)
method of your context (typically, your Activity).
and remove
connect(); // in onCreate
Also you are running network related operation on the ui thread. You need to use a thread
or AsyncTask
Example :
public void connect(View v) {
new TheTask().execute();
}
class TheTask extends Asynctask<Void,Void,Void>
{
@Override
protected Void doInBackground(Void... params) {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://www.yiinotes.com/nutrimondo/web/meals/week");
try {
client.execute(request);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
这篇关于为什么我无法执行的活动越来越java.lang.IllegalStateException的方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!