Java 在Android中创建同步HTTP GET请求
我试图通过HTTPGET获取一些文本并将其显示到UI。我不需要异步任务(即,用户必须等到我完全获得文本) 我在主线程中尝试了这个Java 在Android中创建同步HTTP GET请求,java,android,Java,Android,我试图通过HTTPGET获取一些文本并将其显示到UI。我不需要异步任务(即,用户必须等到我完全获得文本) 我在主线程中尝试了这个 try { String url = URL_HERE; HttpGet httpget = new HttpGet (url); ResponseHandler<String> responseHandler = new BasicResponseHandler(); text = Client.execute(http
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();
}
试试看{
字符串url=此处的url\u;
HttpGet HttpGet=新的HttpGet(url);
ResponseHandler ResponseHandler=新BasicResponseHandler();
text=Client.execute(httpget,responseHandler);
}
捕获(例外情况除外){
text=ex.getLocalizedMessage();
}
但我总是看到一个例外。
我只需要一个简单的机制来获取文本。你能建议一下吗
非常感谢,根据Android的设计,所有网络都必须在一个单独的线程中。请求很可能需要一段时间,用户必须尽可能少地等待,以避免麻烦。因此,您必须使用
AsyncTask
或类似工具。您应该使用AsyncTask,以便UI线程不会冻结。如果UI线程冻结,Android将向用户显示一个“应用程序无响应”对话框,因此在异步任务中执行调用非常重要,即使您不希望用户在执行该任务时使用UI
您可以“阻止”覆盖ASyncTask中onPreExecute方法的UI(例如显示进度对话框),然后“取消阻止”覆盖onPostExecute方法的UI(例如删除进度对话框)。您应该使用ASyncTask,但如果必须使用同步方法 试一试 字符串resut=execute().get().toString() 它将冻结用户界面(应用程序不响应),直到您收到来自httpget的消息
AsyncTask
执行网络操作
在android中“android应用程序无响应”
(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
}
}
}
公共类FrgLatein扩展片段{
//新实例
公共静态FrgLatein newInstance(){
Log.d(“FrgLatein”、“newInstance”);
frgaltein片段=新frgaltein();
返回片段;
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
Log.d(“FrgLatein”、“onCreateView”);
视图=充气机。充气(R.layout.frg_latein,容器,假);
设置选项菜单(真);
返回视图;
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
Log.d(“frglastein”,“onActivityCreated”);
super.onActivityCreated(savedInstanceState);
}
@凌驾
public void onStart(){
Log.d(“FrgLatein”、“onStart”);
super.onStart();
新建LongOperation1()。执行(“”);
}
私有类LongOperation1扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
//Web服务在这里长期运行吗
试一试{
字符串url=此处的url\u;
HttpGet HttpGet=新的HttpGet(url);
ResponseHandler ResponseHandler=新BasicResponseHandler();
text=Client.execute(httpget,responseHandler);
}
捕获(例外情况除外){
text=ex.getLocalizedMessage();
}
返回“已执行”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//在这里执行UI任务
}
@凌驾
受保护的void onPreExecute(){
//在这里执行UI任务
}
@凌驾
受保护的void onProgressUpdate(void…值){
//在这里执行UI任务,这必须在后台任务像下载过程一样运行时完成
}
}
}
请打破悬念,例外是……这很容易。异常可能是NetworkOnMainThreadException
或它的名称。顺便说一句:尽量避免捕获所有对象(catch(异常示例)
)