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

标签 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)

最佳答案

更改为

 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) 方法(通常是您的 Activity )。

并移除

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

关于java - 为什么我无法执行获取 java.lang.IllegalStateException 的 Activity 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20159963/

相关文章:

java - 从外部 fragment 调用内部AsyncTask

java - 基于注释的 Spring bean 验证

java - 特定类的异常处理/映射

android - 使用从 URL 下载的图像在主屏幕上创建快捷方式

java - Android 在同一页面上滚动到 ID

java - 如何从 Jersey servlet中的curl请求中提取参数?

java - 如何在 Java 中使用 MD5 和 DES 调试 "Given final block not properly padded"?

android - 如何选择要使用的绑定(bind)转换或绑定(bind)适配器?

android - 旋转端口登陆Android4.X后如何避免在智能手机中剪切/复制/粘贴?

java - 无法在 PDF 查看器应用程序中打开 PDF