2014-07-25 42 views
0

我想通过HTTP GET获取一些文本并将其显示到UI。我不需要一个异步任务(即用户必须等到我完全收到文本)。在Android中创建同步HTTP GET请求

我在主线程

try { 
    String url = URL_HERE; 
    HttpGet httpget = new HttpGet (url); 
    ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
    text = Client.execute(httpget, responseHandler); 
} 
catch(Exception ex) { 
    text = ex.getLocalizedMessage(); 
} 

试过,但我总是看到一个例外。 我只需要一个简单的机制来获取文本。你能建议吗?

非常感谢你,

+0

请打破悬念,而例外的是... – nobalG

+0

这很容易。这个异常可能是'NetworkOnMainThreadException'或者叫做什么。顺便说一句:尽量避免catch-alls('catch(Exception ex)') – stealthjong

回答

0

所有网络必须是由Android的设计一个单独的线程。请求很可能需要一些时间,用户必须尽可能少地等待。所以,你必须使用AsyncTask或类似。

0

您应该使用ASyncTask,以便UI线程不会冻结。如果UI线程冻结,Android将向用户显示“应用程序未响应”对话框,因此即使您不希望用户在执行此操作时使用UI,在ASyncTask中执行呼叫也很重要。

您可以“阻止”UI覆盖ASyncTask中的onPreExecute方法(例如显示进度对话框),然后“解除阻塞”它覆盖onPostExecute方法(例如删除进度对话框)。

+0

非常感谢 –

1

您应该使用的AsyncTask,但如果你必须使用一个同步方法 尝试

字符串resut =执行()得到()的toString()。

将冻结UI(不含应用程序没有响应),直到你从HTTPGET

0
  • 消息你应该总是使用AsyncTask在安卓
  • 执行网络操作 因为任何需要更多时间来加载到UI会导致 "Unresponsive of the android application"(ANR)

样品::

public class FrgLatein extends Fragment { 
     //New-Instance 
     public static FrgLatein newInstance(){ 
      Log.d("FrgLatein", "newInstance"); 
      FrgLatein fragment = new FrgLatein(); 
      return fragment; 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      Log.d("FrgLatein", "onCreateView"); 
      View view=inflater.inflate(R.layout.frg_latein, container, false); 
      setHasOptionsMenu(true); 


      return view; 
     } 

     @Override 
     public void onActivityCreated(Bundle savedInstanceState) { 
      Log.d("FrgLatein", "onActivityCreated"); 
      super.onActivityCreated(savedInstanceState); 

     } 

     @Override 
     public void onStart() { 
      Log.d("FrgLatein", "onStart"); 
      super.onStart(); 
      new LongOperation1().execute(""); 

     } 

    private class LongOperation1 extends AsyncTask<String, Void, String> { 

      @Override 
      protected String doInBackground(String... params) { 
       // Do the Web service long run here 
      try { 
       String url = URL_HERE; 
       HttpGet httpget = new HttpGet (url); 
       ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
       text = Client.execute(httpget, responseHandler); 
       } 
       catch(Exception ex) { 
       text = ex.getLocalizedMessage(); 
       } 
       return "Executed"; 
      } 

      @Override 
      protected void onPostExecute(String result) { 
       // Do the UI-task here 

      } 

      @Override 
      protected void onPreExecute() { 
       // Do the UI-task here 
      } 

      @Override 
      protected void onProgressUpdate(Void... values) { 
       // Do the UI-task here which has to be done during backgroung tasks are running like a downloading process 
      } 
     } 
}