zoukankan      html  css  js  c++  java
  • 记录关于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出现无响应的情况!!!希望没有误导到别人。。。

  • 相关阅读:
    IDF实验室-CTF训练营-牛刀小试CTF
    百度杯CTF夺旗大赛9月场writeup
    基于Mapxtreme for JAVA的电子地图设计与实现
    centos下 apache+mysql+php的安装
    ssh远程登陆
    毕业设计-JSP论文盲审系统
    Android毕业设计-微圈
    基于Android的高校饮水宝app
    小程序不支持wx.request同步请求解决方法
    微信小程序服务类目大坑:特殊行业服务类目所需资质材料
  • 原文地址:https://www.cnblogs.com/999625696397qq/p/10804434.html
Copyright © 2011-2022 走看看