为什么我无法执行获取java.lang.IllegalStateException的活动的方法?

时间:2013-11-23 07:49:32

标签: java android

我正在创建新项目。 添加了AndroidManifex的权限

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

改变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();
        }
    }
}

这是我的布局:

<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>

但是当我按下按钮时,我得到:

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)

1 个答案:

答案 0 :(得分:7)

更改为

 public void connect(View v) { // missed View as param

http://developer.android.com/reference/android/view/View.html#attr_android:onClick

例如,如果您指定android:onClick="sayHello",则必须声明上下文的public void sayHello(View v)方法(通常是您的活动)。

并删除

  connect(); // in onCreate

此外,您正在ui线程上运行与网络相关的操作。您需要使用threadAsyncTask

示例:

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; 
 }
}