2015-08-28 44 views
0

我被告知使用Asynctasks。但我想知道。是否有可能在一個正常的功能內做一個webrequest?現在我需要始終使用這樣的代碼塊:Java/Android webrequesting

private static HashMap<String, String> retrn = new HashMap<String,String>(); 
    private static class Web extends AsyncTask<String, String, Connection.Response> { 
     protected Connection.Response doInBackground(String... modefiers) { 
      Connection.Response res = null; 
      ArrayList<String> ModList = ToAr(modefiers); 
      ModList.remove(modefiers[0]); 
      try { 
       res = Jsoup.connect(modefiers[0]) 
         .data(ModList.toArray(new String[ModList.size()])) 
         .method(Connection.Method.POST) 
         .execute(); 
       Document doc = res.parse(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return res; 
     } 

     protected void onPostExecute(Connection.Response result) { 
      retrn.put(result.url().toString(), result.body()); 
     } 
    } 

    private static ArrayList ToAr(Object... listr){ 
     ArrayList Ar = new ArrayList(); 
     for (Object ari : listr){ 
      Ar.add(ari); 
     } 
     return Ar; 
    } 

回答

0

您可以使用不同類型的解決方案來運行您的請求。儘管如此,請記住,您的調用應該是異步的,以避免凍結UI並獲取NetworkOnMainThreadException。因此,作爲原始響應,不,您不應該在「正常功能」中運行webrequests。其他的解決辦法是

  • 裝載機
  • RxJava
  • 古典主題

但AsyncTasks是做工作的好和更簡單的方法。爲避免重複這樣的代碼塊,單獨定義類,而不是innerClasses:

MyAsynctask.java:

public class MyAsyncTask extends AsyncTask<String, String, Connection.Response> { 
//you code... 
} 
+0

所以沒有隻使用一個功能類似的方式:getwebcontent(字符串URL)? –

+0

如果你這樣做,沒有異步性(只是一個「正常」的方法),你會得到一個NetworkOnMainThread異常。此外,這是一種反模式。所以不行。 –