AsyncTask.getStatus()不返回Status.FINISHED

时间:2015-06-03 15:23:32

标签: java android xml post android-asynctask

我想开始编程可以与服务器通信以接收/发送数据并将其存储在服务器上的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')); ?>

现在我可以看到包含内容的文件了。

我唯一的问题是,如果我删除代码以从服务器读取响应,则它不会创建该文件。有什么不对或者这只是正常行为吗?

1 个答案:

答案 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 ()

现在你应该在完成后获得你的结果。