2012-03-31 46 views
0

我是一個相對較新的Android開發人員,我無法理解如何執行此操作。我一直在研究所有的論壇,我做了一些進步,但仍然在這裏。 因此,我想要做的是將POST請求發送到網頁(它只發送一個POST參數)並將結果作爲字符串返回的常用函數。 我這裏的主線程用異步發送HttpPost並獲取字符串結果

public class AppActivity extends Activity { 
    HTTPPostData PostData = new HTTPPostData("id"); 
    PostData.execute(); 
    txtLabel.setText(PostData.Result); 
} 

,我有我的HTTPPostData異步類

public class HTTPPostData extends AsyncTask<String, Long, Object> { 
String Value = null; 
String Result = null; 

public HTTPPostData(String query) { 
    Value = query; 
    } 

@Override 
protected String doInBackground(String... params) { 
    byte[] Bresult = null; 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost("http://www.mypage.com/script.php"); 
     try { 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
     nameValuePairs.add(new BasicNameValuePair("cmd", Value)); 
      post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); 
      HttpResponse response = client.execute(post); 
      StatusLine statusLine = response.getStatusLine(); 
      if(statusLine.getStatusCode() == HttpURLConnection.HTTP_OK){ 
       Bresult = EntityUtils.toByteArray(response.getEntity()); 
       Result = new String(Bresult, "UTF-8"); 
      } 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
     } 
     return Result; 
    } 
} 

我想要使用此功能幾次(同一個活動中或以相同的其他活動分享應用)。我現在有點混亂,所以我需要你的幫助。我的理解是,我在doInBackground()完成之前要求結果,並且得到一個空的結果。

在此先感謝您的幫助

回答

1

對此:

HTTPPostData PostData = new HTTPPostData("id"); 
PostData.execute(); 
txtLabel.setText(PostData.Result); 

你的問題是,你正在處理的AsyncTask喜歡它只是一個普通的功能。將網頁加載從主線程移出是一件好事,但如果您依賴於下一條指令的結果,那麼它不會對您有所幫助,您仍然阻止主程序等待結果。你需要把AsyncTask看作是一個'忘記'的操作,在這個操作中你不知道它會在什麼時候回來。

更好的東西在這裏做會是這樣的:

HTTPPostData PostData = new HTTPPostData("id"); 
PostData.execute(); 
txtLabel.setText("Loading..."); 

,然後在的AsyncTask:

protected void onPostExecute(String result) { 
    txtLabel.setText(result); 
} 

這可以讓你的主線程得到與做它的業務不知道結果的asynctask,然後一旦數據可用,asynctask將填充文本標籤和結果。

+0

我更喜歡在應用程序的不同情況下擁有一個公共類,但現在我發現我必須爲每個類創建一個異步類。例如,如果我想獲取一個數字,然後將其與存儲在SharedPrefferences中的其他數據進行比較,然後獲取一個字符串並將其顯示在某個TextView上,則必須爲這些操作中的每一個創建一個單獨的類,其中包含幾乎相同的代碼。正如我所想的,異步類不能創建兩次。 – ali 2012-03-31 21:25:18

+0

@ali我會把所有的Http-to-String的東西放到一個常用的實用函數中,然後爲每個你想獲得互聯網數據的地方創建一個準系統AsyncTask,它只是調用你的通用函數,然後描述你的回調結果想在onPostExecute。它可能感覺被浪費了創造多種asynctask,但他們每個人都必須執行不同的回調。也許有一個更清潔的方式,但我不確定。也許你可以創建一個抽象的asynctask類,然後覆蓋你想要使用它的每個地方的onPostExecute。 – Tim 2012-03-31 21:51:06

+0

這就是我所做的。謝謝! – ali 2012-04-03 17:04:42

相關問題