我正在尝试将数据发布到外部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文件中授予互联网权限