Android API 14-网络操作/异步任务
最近,我提出了一个关于使用POST数据执行HTTP请求的问题(在这里找到:),我被告知需要尝试类似AsyncTask的操作,因为我无法在主线程中执行网络操作 简而言之,我不知道该怎么做。感谢您的帮助!这是我的密码:Android API 14-网络操作/异步任务,android,sdk,Android,Sdk,最近,我提出了一个关于使用POST数据执行HTTP请求的问题(在这里找到:),我被告知需要尝试类似AsyncTask的操作,因为我无法在主线程中执行网络操作 简而言之,我不知道该怎么做。感谢您的帮助!这是我的密码: package me.babblebox.application; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.http.Http
package me.babblebox.application;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
public class BabbleBoxActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void check_login() {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://babblebox.me/android/test.php");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "Hi"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
public void check_login_button(View v) {
check_login();
}
}
package me.babblebox.application;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入org.apache.http.HttpResponse;
导入org.apache.http.NameValuePair;
导入org.apache.http.client.ClientProtocolException;
导入org.apache.http.client.HttpClient;
导入org.apache.http.client.entity.UrlEncodedFormEntity;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.apache.http.message.BasicNameValuePair;
导入android.app.Activity;
导入android.os.Bundle;
导入android.view.view;
公共类BabbleBoxActivity扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
公共无效检查\u登录(){
//创建一个新的HttpClient和Post头
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(“http://babblebox.me/android/test.php");
试一试{
//添加您的数据
List nameValuePairs=新的ArrayList(2);
添加(新的BasicNameValuePair(“id”,“12345”);
添加(新的BasicNameValuePair(“stringdata”、“Hi”);
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
//执行HTTP Post请求
HttpResponse response=httpclient.execute(httppost);
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
}捕获(IOE异常){
//TODO自动生成的捕捉块
}
}
公共作废检查\登录\按钮(视图v){
检查_login();
}
}
还可以阅读
下面的内容远非完美,但您可以尝试类似的内容来开始
public class BabbleBoxActivity extends Activity {
// Leave onCreate() as it is
public void check_login_button(View v) {
PostTask postTask = new PostTask();
postTask.execute();
}
// EDITED THE LINE BELOW TO INCLUDE 'class'
private class PostTask extends AsyncTask<Void, Void, Void> {
// Move the code that was in check_login to the
// doInBackground method below
protected Void doInBackground(Void... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://babblebox.me/android/test.php");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "Hi"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
return null;
}
}
}
…我得到了以下响应标题
Header count: 6
Header: name=Date value=Sun, 11 Dec 2011 16:38:19 GMT
Header: name=Server value=LiteSpeed
Header: name=Connection value=close
Header: name=X-Powered-By value=PHP/5.3.8
Header: name=Content-Type value=text/html
Header: name=Content-Length value=4
来自任何web“请求”(GET、POST、PUT)的响应都会因您所使用的远程服务而异。您需要确定服务器将返回什么,然后相应地处理响应。如果您不希望
异步任务
(无论出于何种原因),您可能可以执行以下操作
public void checkLoginAsync() {
Executors.newSingleThreadExecutor(new Runnable(){
@Override
public void run() {
checkLogin();
});
}
您可能会使
checkLogin()
接受侦听器的一些knd,然后它会向(比如)实现该侦听器的活动报告类似onLoginError
和onloginsAccess的内容。或者,您可以将其应用到您的应用程序中,这样无论当前显示的是什么活动,您都可以终止程序。您看过吗?它几乎涵盖了它。。。你有什么特别的问题吗?@Craigy是的,我的问题是我如何使用它将POST/GET数据发送到HTTP网页,并获取回复?如果我不能做到这一点,有没有一种方法可以用OP中的方法在不同的线程上实现呢?因为我不知道怎么做。对不起-在PostTask定义中应该是私有类PostTask extends…
-我省略了类的工作。它不会崩溃,所以我想这是一个好的开始!最后一件事-如何使用响应变量集?它是否在发送数据的页面上包含响应或其他内容?谢谢,谢谢,这让我更了解它。但是如果我想得到实际页面打印出来的输出呢?例如,页面echo的“Test”,我将如何使用此代码将其转换为要使用的字符串?这是AsyncTask的良好替代方案,具体取决于所需的复杂性。
public void checkLoginAsync() {
Executors.newSingleThreadExecutor(new Runnable(){
@Override
public void run() {
checkLogin();
});
}