Android按钮onClick运行方法,不幸的是App已停止

时间:2015-02-27 05:27:18

标签: java php android

我正在尝试将数据发布到外部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

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

6 个答案:

答案 0 :(得分:2)

更改您的方法
public void postData(String toPost) {

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

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

答案 1 :(得分:2)

见这里:

传递到onClick属性

android:onClick方法名称必须是公开的,并接受视图作为其唯一参数

表示方法必须如下:

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

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

NetworkOnMainThreadException例外。

要避免此异常,请使用AsyncTask在后台线程

中发出api请求

答案 2 :(得分:1)

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

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

网络操作必须在后台进行

否则您将获得NetworkOnMainThreadException

Example

答案 3 :(得分:1)

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

答案 4 :(得分:1)

以下是您想要的示例,我认为您会发现它很有用

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

答案 5 :(得分:1)

为Ksoap2和Async Task引用此链接。 How can I make a ksoap2 call in async task?

不要忘记导入Ksoap2.jar文件并在AndroidManifest文件中提供互联网权限。