线程和Asynctask任务用于httppost

时间:2013-10-01 19:19:15

标签: android multithreading android-asynctask http-post

朋友们,我需要帮助使用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开发的经验非常少

3 个答案:

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

中放置需要在UI上访问的代码片段

答案 2 :(得分:0)

我建议您使用robospiceother frameworks as alternative

  • 排球
  • DataDroid
  • REST提供商
  • REST Droid
  • PostMan(响两次)Lib
  • 离子
  • droidQuery
  • Android作业队列
  • 因为可以在onPostExecute到达之前重新创建活动。 AsyncTask不是Activity中网络的好例子。