2013-01-01 58 views
0

我在過去幾天問過這個問題的變化。我不理解或建立正確的聯繫等,所以我非常沮喪,不理解我應該走哪條路。完全丟失試圖撥打網絡服務

我開發了一個XAMLX WCF工作流服務,我的Windows客戶端與它交互就好了。我是新來的android和java,因此基本上是一個NOOB。我的服務使用BasicHttpBinding,並期望請求中有幾個字符串值(uid & pwd)。答案只是一個字符串。

現在在android上我完全失去了。我已閱讀使用AsyncTask,我聽說它有重大問題並使用RoboSpice。看着RoboSpice,它看起來非常堅實,但非常僵硬的學習曲線。我聽說過使用LoopJ的僵化學習曲線,因爲開始時它會更容易。在那裏投擲希望你使用JSON和耶的人。我絕對失去了。

所以我被拉到了很多不同的方向。我知道我需要它作爲Async,因此它不會鎖定ui線程,我希望得到一個穩固可靠的解決方案,但現在只需與服務進行同步交互就可以了,這是令人鼓舞的。

這裏是我的基本知識: 發送請求的服務。 讓應用程序暫停/循環等進度條將是美好的,但一個簡單的循環,不掛起,現在就好了。 接收響應並繼續處理。

這對我來說在.NET中非常簡單,我認爲這很簡單。只是要表明驕傲在秋天來臨之前。

TIA JB


直接的問題

如已評論也有我的OP幾個隱含的問題。那是因爲我不知道該問什麼。所以讓我們暫時與AsynchTask一起。讓我們稱之爲我的寶貝步驟。 以下是我的問題: 如何我是否關聯值來填充請求?在.NET中,我會創建一個匹配請求所需的對象。所以我的對象將有一個UserName屬性和密碼屬性。我會分配他們的值,如obj.UserName =「Joe」;然後我會調用服務操作並將其傳遞給obj。

如何我確定我正在使用正確的庫嗎?我讀過AsyncTask使用Apache Http Client庫。好吧,我谷歌拿到罐子,顯然它是生命的盡頭。但仍然可用,所以我下載最新的,並把它放在我的lib文件夾....但我沒有,因爲我可以導入org.apache.http.HttpResponse沒有它,所以我使用哪個版本,然後我應該使用一個較舊的或最新的。

**最後,我該如何讓應用程序暫停,因爲此代碼執行某些操作(雖然它從未在我的服務計算機的日誌中顯示),而當它停止執行某些操作時,代碼會繼續執行並在達到時崩潰它需要來自服務的數據......但它不在那裏。一個進度條是蜜蜂的膝蓋。

這裏是我的實現代碼:

public class AsyncHttpRequestManager extends AsyncTask<String, Boolean, String> 
{ 
private static final String serviceUrl = "http://www.serviceurl.com/service.xamlx"; 

@Override 
protected String doInBackground(String... params) 
{ 

    try 
    { 
     DefaultHttpClient client = new DefaultHttpClient(); 
     HttpPut putRequest = new HttpPut(serviceUrl); 
     putRequest.setHeader("Content-type", "text/plain"); 
     putRequest.setHeader("Accept", "text/plain"); 
      putRequest.setEntity(new StringEntity(params[0])); //This one is connected to my first question. How do I get the proper associations for the operations contract. 
      HttpResponse response = client.execute(putRequest); 
      InputStream content = response.getEntity().getContent(); 
     BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); 
     String result = ""; 
     String s = ""; 
     while ((s = buffer.readLine()) != null) 
     { 
      result += s; 
     } 
     return result; 

    } 
    catch (UnsupportedEncodingException e) 
    { 
     Log.e("AsyncOperationFailed", e.getMessage()); 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) 
    { 
     Log.e("AsyncOperationFailed", e.getMessage()); 
     e.printStackTrace(); 
    } catch (IOException e) 
    { 
     Log.e("AsyncOperationFailed", e.getMessage()); 
     e.printStackTrace(); 
    } 
    return null; 

} 

protected void onPostExecute(String result) 
{ 
    Log.d("MESSAGE", result); 
} 

}

我稱之爲是這樣的:

new AsyncHttpRequestManager().execute("joe","asdf"); 

如果需要更多的信息,我會很高興地張貼。

+0

網絡操作應該在線程上進行,而不是在線程上進行。所以使用asynctask是一種可能性。我主要使用自己創建的線程來處理網絡操作,並使用廣播receiverbto更新ui。 – Tobrun

+0

「我已閱讀使用AsyncTask,我聽說它有重大問題」什麼是重大問題? AsyncTask可能比較棘手,如果你試圖從中更新UI,但是將它用於HTTP綁定,那麼使用回調或廣播來加載UI是標準做法。除此之外,你的具體*問題是什麼。您的帖子中似乎有很多隱含的問題。 – Simon

+1

我剛剛讀過你的其他問題。我個人的建議是儘量做到「現成」。只有在基本框架無法讓您完成某些任務時才使用第三方庫。這個問題可能有幫助http://stackoverflow.com/questions/3505930/make-an-http-request-with-android – Simon

回答

0

您應該一次提出一個問題,這就是SO的設計和策劃工作。

對於HTTP認證

http://developer.android.com/reference/org/apache/http/auth/UsernamePasswordCredentials.html

例如

HttpClient client = new HttpClient(); 
client.getParams().setAuthenticationPreemptive(true); 
Credentials defaultcreds = new UsernamePasswordCredentials("username", "password"); 
client.getState().setCredentials(new AuthScope("myhost", 80, AuthScope.ANY_REALM), defaultcreds); 

Asynctask不需要任何外部庫,它是Android平臺的一部分。不要對HTTPClient和Asynctask感到困惑。 Asyntask是一個通用類,旨在調用背景處理在與主UI線程分離的線程上以避免阻塞。恰巧你正在考慮使用Asynctask來處理你的Web請求,但它們沒有任何聯繫。

有關「如何將數據返回到我的應用程序」的問題最好單獨提出,但實際上,您是按順序思考的。你的應用程序不應該暫停。有很多方法,進度對話框都是正確的,以便正確處理。

+0

足夠公平的一個問題。哪裏??????你傳遞服務請求合同所需的值嗎?例如在我的OP中,編輯哪些行/我的請求parms發送到哪裏,以便服務知道要檢索哪些數據併發回? – GPGVM

+0

...或者不能用AsyncTask來完成,因爲它只能拉動? – GPGVM