我想开始编程可以与服务器通信以接收/发送数据并将其存储在服务器上的Android应用程序。
我一直在读这个,我想我只需要用POST请求将数据发送到服务器(可能是一个XML文件,因为我可能需要发送图像),然后解析服务器端的XML,并且做无论我需要什么。
首先,我只想通过我的应用发送一些文字。
这是我的Post类,用于AsyncTask:
public class Post extends AsyncTask<String, Void, Boolean> {
Context context;
String response;
public Post (Context ctx){
context = ctx;
}
@Override
protected Boolean doInBackground(String... params) {
URL url;
HttpURLConnection conn;
try {
url = new URL("http://192.168.1.40/index.php");
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(5000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "text/xml; charset=\"utf-8\"");
conn.setDoInput(true);
conn.setDoOutput(false);
conn.connect();
String body = "<test>\"some testing\"</test>";
//Send POST
OutputStreamWriter output = new OutputStreamWriter(conn.getOutputStream(),"UTF8");
output.write(body);
output.flush();
output.close();
//Get response
String line = "";
InputStream is = conn.getInputStream();
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) sb.append(line);
response = sb.toString();
br.close();
is.close();
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public String getResponse(String s)
{
}
使用按钮发送请求:
public class MainActivity extends ActionBarActivity {
Context ctx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ctx = this;
Button b = new Button(this);
b.setText("Send POST");
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Post p = new Post(ctx);
p.execute();
while(p.getStatus() != AsyncTask.Status.FINISHED);
Toast.makeText(ctx,p.getResponse(),Toast.LENGTH_LONG).show();
}
});
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
params.topMargin = 0;
params.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
addContentView(b,params);
}
这是我的服务器端php代码:
<?php print_r($_POST);?>
我知道有很多关于这些内容的帖子,我经历过很多帖子,但我无法弄清楚这个问题。
HttpURLConnection响应代码为200,表示HTTP_OK。
在index.php页面中,唯一的输出是:“Array()”。
当我调试时,响应字符串也是“Array()”,问题是AsyncTask的状态一直是“RUNNING”。
P.S - 我正在使用wampserver作为网络服务器
提前致谢。
编辑:我遵循Pawel的建议并在Toast之前尝试过这个:while(p.getStatus() != AsyncTask.Status.FINISHED);
应用程序崩溃,所以我猜它永远不会获得FINISHED状态。
还尝试了AsyncTask.get()方法,如下所示:
try {
Toast.makeText(ctx, p.get().toString(), Toast.LENGTH_LONG).show();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
Toast文本中有一个“false”,这意味着我的p.doInBackground()完成了执行。为什么我仍然没有任何结果?
最后编辑:我还没有放弃!经过大量的调试和挫折后,我想我已经找到了问题。这是PHP代码!我期待它在浏览器中向我显示帖子请求,但显然不会那样。
我把它更改为:
<?php file_put_contents('test.txt', file_get_contents('php://input')); ?>
现在我可以看到包含内容的文件了。
我唯一的问题是,如果我删除代码以从服务器读取响应,则它不会创建该文件。有什么不对或者这只是正常行为吗?
答案 0 :(得分:0)
你应该读到这个: http://developer.android.com/reference/android/os/AsyncTask.html
你知道Post
是异步操作,因为它扩展了AsyncTask吗?这意味着可以在调用Toast.makeText(ctx,p.getResponse(),Toast.LENGTH_LONG).show();
小提示:
检查以上关于方法的链接文档:
public final Result get ()
和public final AsyncTask.Status getStatus ()
。
现在你应该在完成后获得你的结果。