记录关于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出现无响应的情况!!!希望没有误导到别人。。。

原文地址:https://www.cnblogs.com/999625696397qq/p/10804434.html