Android按钮onClick运行方法,不幸的是应用程序已停止


Android Button onClick run method, Unfortunately App has stopped

我正在尝试将数据发布到外部PHP文件,我有一个按钮,当我点击它时,它应该运行该方法并将数据发布至PHP文件,然后返回一些数据并打印它。

activity_main.xml中:

<Button
        android:onClick="postData" />

MainActivity.java:中

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void postData(String toPost) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("__the_php_file.php");
        String MyName = "Amr";
        try {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
            nameValuePairs.add(new BasicNameValuePair("action", MyName));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String response = httpclient.execute(httppost, responseHandler);
            String reverseString = response;
            Toast.makeText(this, "response" + reverseString, Toast.LENGTH_LONG).show();
        } catch (ClientProtocolException e) {
            Toast.makeText(this, "CPE response " + e.toString(), Toast.LENGTH_LONG).show();
            // TODO Auto-generated catch block
        } catch (IOException e) {
            Toast.makeText(this, "IOE response " + e.toString(), Toast.LENGTH_LONG).show();
            // TODO Auto-generated catch block
        }
    }
}

问题是当我点击按钮时,它会给我这个错误:Unfortunately App has stopped

为什么这个代码不起作用?

从更改方法

public void postData(String toPost) {

public void postData(View v) {...}

您应该传递View作为onClick()方法的参数。

请参阅此处:

android:onClick传递给onClick属性的方法名称必须是公共的,并接受View作为其唯一参数

意味着方法必须像:

public void postData(View view) {
  ....
}

当前实现中的第二个重要点是在UI线程上调用HttpClient.execute,这可能导致:

NetworkOnMainThreadException异常。

为了避免此异常,请使用AsyncTask在后台线程中发出api请求

这里有一个你想要的例子,我想你会发现它很有用

http://mobiledevtuts.com/android/android-http-with-asynctask-example/

使用AsyncTask发送到php文件并在onPreexecute 上打印

public void methodName(final View view) {
// Do your tasks here
}

您应该更改代码以发送网络操作。

网络操作必须在后台进行

否则您将获得NetworkOnMainThreadException

示例

指Ksoap2和异步任务的链接。如何在异步任务中进行ksoap2调用?

不忘导入Ksoap2.jar文件,并在AndroidManifest文件中授予互联网权限