记录关于Android多线程的一个坑
最近在写项目的时候由于联网用得比较频繁,就简单地封装了一个工具类,省得每次联网得时候都要把联网配置写一遍,代码如下:
1 public class okhttp_plus { 2 public static String responseDate = ""; 3 public static String sendRequestwithOkHttp(final String url, final RequestBody requestBody, final Context context) { 4 //开启现线程发起网络请求 5 new Thread(new Runnable() { 6 @Override 7 public void run() { 8 try { 9 OkHttpClient client = new OkHttpClient.Builder() 10 .retryOnConnectionFailure(true) 11 .connectTimeout(10, TimeUnit.SECONDS) 12 .readTimeout(10, TimeUnit.SECONDS) 13 .build(); 14 15 Request request = new Request.Builder() 16 .post(requestBody) 17 .addHeader("Connection","close") 18 .addHeader("Content-Type","application/x-www-form-urlencoded") 19 .url(url) //网址有待改动 20 .build(); 21 22 Call call = client.newCall(request); 23 responseDate = ""; 24 try { 25 Response response = call.execute(); 26 responseDate = response.body().string(); 27 Log.d("ZGH", "这是工具类里面的responsedata"+responseDate); 28 } catch (final Exception e) { 29 e.printStackTrace(); 30 if (e instanceof SocketTimeoutException) { 31 Toast.makeText(context, "连接超时", Toast.LENGTH_SHORT).show(); 32 } 33 if (e instanceof ConnectException) { 34 Toast.makeText(context, "连接异常", Toast.LENGTH_SHORT).show(); 35 } 36 37 if (e instanceof ProtocolException) { 38 Toast.makeText(context, "未知异常,请稍后再试", Toast.LENGTH_SHORT).show(); 39 } 40 } 41 42 } catch (Exception e) { 43 e.printStackTrace(); 44 } 45 } 46 }).start(); 47 48 return responseDate; 49 } 50 }
但是这个方法总是出现log打印出来的responsedata是正常的,但是返回值里面的responsedata确是空,百思不得其解,在网上查了各种资料也没有关于这种情况得记录,终于在崩溃的边缘想起了这个方法里面新开了一个线程,而多线程的执行是同步的,所以主线程肯定是没等到联网线程返回结果就将responsdata返回了,所以肯定是返回空值了,问题找出来之后,怎么解决也是想了一会,最终我在返回值前面加了一个while循环,代码如下:
1 //while循环用于等待网络线程返回response 2 while (responseDate.equals("")){ 3 }
while循环先判断一下返回值是否为空,如果为空就表示联网请求还未完成,一直到responsedata不为空才向下执行,问题解决。
=============================================================
数月之后想起来博客忘记改了,不能用while循环判断,因为如果联网失败的话,while就会变成死循环,导致app出现无响应的情况!!!希望没有误导到别人。。。