2011-12-11 78 views
1

我最近提出基于使用POST数据HTTP请求(这里找到:Android API 14 - POST Data to HTTP)一个问题,有人告诉我,我需要尝试像的AsyncTask的东西,因为我无法进行网络主线程中的操作。Android的API 14 - 网络运营/的AsyncTask

总之形式,我不知道如何做到这一点。任何帮助表示赞赏!这里是我的代码:

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(); 
    } 
} 
+0

你有没有看着http://developer.android.com/resources/articles/painless-threading.html?它几乎涵盖了它...你有特定的问题吗? – Craigy

+0

@Craigy是的,我的问题是我怎么会用这个来发送POST/GET数据到一个HTTP网页,并获取回响应?如果我不能这样做,是否有办法用我的方法在OP中执行,但在另一个线程上执行?因为我不知道如何去做。 – Oyed

回答

1

阅读Processes and threadsAsyncTask

以下是远非完美,但你可以尝试这样的事情上手...

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; 
     } 
    } 
} 

在现实中,你需要学习如何PARAMATERS传递到AsyncTask并得到它返回有效的结果。

编辑:

只是出于兴趣,我整理了一下原来的代码(没有的AsyncTask,但在Android 2.2版,它允许在主线程网络操作)。我添加了一些日志代码只是为了检查连接的工作...

HttpResponse response = httpclient.execute(httppost); 
Header[] headers = response.getAllHeaders(); 
Log.d("BabbleBox", "Header count: " + headers.length); 
for (int c = 0; c < headers.length; c++) 
    Log.d("Babblebox", "Header: name=" + headers[c].getName() + " value=" + headers[c].getValue()); 

...我得到了下面的响应头。

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 

从任何网络“请求”(GET,POST,PUT)将取决于正在谈话的远程服务变化的响应。您需要计算出您的服务器将返回的内容,然后相应地处理响应。

+0

谢谢,但是这是我得到:http://uploadir.com/u/7sc192 – Oyed

+0

对不起 - 它应该是'私有类PostTask扩展...'在PostTask定义 - 我省略了工作'class' 。 – Squonk

+0

它不会崩溃,所以我想这是一个好开始!最后一件事 - 我如何使用响应变量集?它是否在其发送数据的页面上包含响应?谢谢。 – Oyed

1

如果你不想AsyncTask(不管是什么原因)你,或许,可以这样做

public void checkLoginAsync() { 

    Executors.newSingleThreadExecutor(new Runnable(){ 
      @Override 
      public void run() { 
        checkLogin(); 
    }); 
} 

你可能会做出checkLogin()接受听众的一些KND则因此报告了类似onLoginError和例如,你的活动实现了这个听众。或者,也许对您的应用程序,以便您可以终止该程序,无论当前显示哪些活动。

+0

取决于所需的复杂性,AsyncTask的良好替代方案。 – Squonk