2011-12-11 50 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