朋友们,我需要帮助使用Asynctask或Threads将android httppost数据发送到服务器 当我点击发布按钮时,我需要将数据发送到我的服务器。但是当我点击它时,应用程序需要转到下一页,数据需要通过后台进程发送。我是Android新手。我不知道是什么正好用于这种任务(Threads或Asyanctask)。 我试过这段代码,但它会给我异常错误
public void startProgress(final String name) {
// Do something long
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);
send(name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
new Thread(runnable).start();
}
public void send(String name)
{
// get the message from the message text box
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://10.0.2.2:8080/Test");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
String co2 =input_field.getText().toString();
nameValuePairs.add(new BasicNameValuePair("Name", name));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
Toast toast = Toast.makeText(getApplicationContext(), "Got it ", Toast.LENGTH_SHORT);
toast.show();
httpclient.execute(httppost);
input_field.setText("");
} catch(Exception e){
Toast toast2 = Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_SHORT);
toast2.show();
}
}
但如果我这样使用它就可以了。(文本是该页面中的TextView项目)
public void startProgress(final String name) {
// Do something long
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
text.post(new Runnable() {
@Override
public void run() {
send(name);
}
});
}
};
new Thread(runnable).start();
}
在下面的代码中你可以解释一下这个问题
text.post(new Runnable() {
@Override
public void run() {
send(name);
}
});
请帮我解决这个问题。如果有更好的方法来满足我的需求请提及它。因为它对Android开发的经验非常少
答案 0 :(得分:5)
您可以使用AsyncTask
这样执行此操作:
public class HttpPostExanple extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
BufferedReader inBuffer = null;
String url = "http://10.0.2.2:8080/Test";
String result = "fail";
try {
HttpClient httpClient = new DefaultHttpClient();
HttpPost request = new HttpPost(url);
List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("name", params[0]));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(
postParameters);
request.setEntity(formEntity);
httpClient.execute(request);
result="got it";
} catch(Exception e) {
// Do something about exceptions
result = e.getMessage();
} finally {
if (inBuffer != null) {
try {
inBuffer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
protected void onPostExecute(String page)
{
//textView.setText(page);
Toast toast = Toast.makeText(getApplicationContext(), page, Toast.LENGTH_SHORT);
toast.show();
}
}
您需要在主要方法中使用此方法
new HttpPostExample().execute(new String[] {name});
检查一下。 希望这会对你有所帮助。
答案 1 :(得分:1)
你应该实现这样的东西:
new Thread(new Runnable() {
public void run() {
send(name); // if this method need to access the UI interface you have to use .post method
}
}).start();
关于您的问题:.post方法causes the Runnable to be added to the message queue. The runnable will be run on the user interface thread.
[reference]
这是必需的,因为如果没有这种方法,你会违反单线程模型:the Android UI toolkit is not thread-safe and must always be manipulated on the UI thread.
在你的代码中,TextView在工作线程上被操纵,这可能会导致非常奇怪的问题。
正如您所看到的,如果您的线程中的方法需要访问UI,您应该使用.post方法,这会使代码更加费力。因此,正确的解决方案可能是使用AsyncTask来管理线程的复杂性。您必须在onPostExecute()
方法
答案 2 :(得分:0)
我建议您使用robospice或other frameworks as alternative:
朗
因为可以在onPostExecute
到达之前重新创建活动。 AsyncTask不是Activity中网络的好例子。