(android) Android什么时候用同步和异步,具体案例。

Android 访问网络的时候什么情况下用同步和异步,大家可以举个具体案例或附加一段代码,非常谢谢。

是的。楼上都说了。我就补充一下。 子线程才能使用网络访问这是必须的。 但同步操作一般局限在多个子线程同时访问同一资源才会使用同步。 所以依然要异步访问网络。但多个异步构成同步

Android已经不让同步执行网络请求了。。
只能异步请求网络数据,防止UI主线程阻塞导致ANR虽然可以曲线救国用同步,但不推荐。
Android上有很多请求框架

  • okhttp

  • android-async-http

  • volley

都可以参考下,也可以自己封装请求框架,看自己需求。

(╯-_-)╯╧╧ 随便吖 …
像okhttp/volley等网络框架都支持同步异步~
只是同步的请求需要放在子线程中~

赞同yuepeng的答案,首先网络请求必须要在子线程发出。
其实判断需不需要异步操作很简单,主线程请求网络数据使用异步,子线程请求网络数据使用同步

compile com.loopj.android:android-async-http:1.4.9

一个网络客户端访问类:

public class NetClient { private static URL url ; public static URL getRul { try { url = new URLGlobalValue.IP + GlobalValue.SLASH + GlobalValue.SERVERPATH; return url; } catch MalformedURLException localMalformedURLException { localMalformedURLException.printStackTrace; return null; } } private static final String BASE_URL = getRul.toString; private static AsyncHttpClient client = new AsyncHttpClient; public static void getString url, RequestParams params, AsyncHttpResponseHandler responseHandler { client.getgetAbsoluteUrlurl, params, responseHandler; } public static void postString url, RequestParams params, AsyncHttpResponseHandler responseHandler { client.postgetAbsoluteUrlurl, params, responseHandler; } private static String getAbsoluteUrlString relativeUrl { return BASE_URL + relativeUrl; }
}

在另一个类中调用,并实现异步操作

 NetClient.post"", requestParams, new AsyncHttpResponseHandler { @Override public void onSuccessint statusCode, Header[] headers, byte[] responseBody { String JsonResult = null; try { JsonResult = IOUtils.toStringresponseBody, "utf-8"; } catch IOException e { e.printStackTrace; } String strResult = MainNet.this.localGson.fromJsonJsonResult,String.class; if strResult != null { MainNet.this.pMainActivity.onSendJsonRegistedstrResult; }else{ Toast.makeTextMainNet.this.pMainActivity.getApplication,"注册失败:服务器拒绝",Toast.LENGTH_LONG.show; } } @Override public void onFailureint statusCode, Header[] headers, byte[] responseBody, Throwable error { Toast.makeTextMainNet.this.pMainActivity.getApplication,"注册失败:联网失败",Toast.LENGTH_LONG.show; } };

通常都是用异步。
只有当你需要按顺序做多个网络请求,并且需要展示总进度的时候用同步才比较好。用过阿里云oss的同学应该踩过这个坑

异步或同步看你针对的是谁。为了防止UI卡死,网络请求不能放在UI线程中(当然也有办法在主线程中执行)。对于UI线程来说,网络请求线程都是异步的。但是如果有多个需要顺序执行的网络请求,那么这几个网路请求在一个子线程中顺序执行。对于子线程来说,他们是同步的,但是对于UI他们始终是异步。

如果要显示总进度只是需要通知UI更新界面,也是异步执行。

访问网络不是都要异步吗?

该答案已被忽略,原因:宜作评论而非答案

发表评论

电子邮件地址不会被公开。 必填项已用*标注