Android 访问网络的时候什么情况下用同步和异步,大家可以举个具体案例或附加一段代码,非常谢谢。
Android已经不让同步执行网络请求了。。
只能异步请求网络数据,防止UI主线程阻塞导致ANR(虽然可以曲线救国用同步,但不推荐)。
Android上有很多请求框架
都可以参考下,也可以自己封装请求框架,看自己需求。
compile 'com.loopj.android:android-async-http:1.4.9'
一个网络客户端访问类:
public class NetClient {
private static URL url ;
public static URL getRul() {
try
{
url = new URL(GlobalValue.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 get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.get(getAbsoluteUrl(url), params, responseHandler);
}
public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.post(getAbsoluteUrl(url), params, responseHandler);
}
private static String getAbsoluteUrl(String relativeUrl) {
return BASE_URL + relativeUrl;
}
}
在另一个类中调用,并实现异步操作
NetClient.post("", requestParams, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
String JsonResult = null;
try {
JsonResult = IOUtils.toString(responseBody, "utf-8");
} catch (IOException e) { e.printStackTrace();
}
String strResult = MainNet.this.localGson.fromJson(JsonResult,String.class);
if( strResult != null) {
MainNet.this.pMainActivity.onSendJsonRegisted(strResult);
}else{
Toast.makeText(MainNet.this.pMainActivity.getApplication(),"注册失败:服务器拒绝",Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Toast.makeText(MainNet.this.pMainActivity.getApplication(),"注册失败:联网失败",Toast.LENGTH_LONG).show();
}
});
异步或同步看你针对的是谁。为了防止UI卡死,网络请求不能放在UI线程中(当然也有办法在主线程中执行)。对于UI线程来说,网络请求线程都是异步的。但是如果有多个需要顺序执行的网络请求,那么这几个网路请求在一个子线程中顺序执行。对于子线程来说,他们是同步的,但是对于UI他们始终是异步。
如果要显示总进度只是需要通知UI更新界面,也是异步执行。
8 回答6.4k 阅读
1 回答4.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
是的。楼上都说了。我就补充一下。 子线程才能使用网络访问这是必须的。 但同步操作一般局限在多个子线程同时访问同一资源才会使用同步。 所以依然要异步访问网络。但多个异步构成同步