«

HttpClient.execute() 阻塞问题

时间:2024-3-2 18:11     作者:韩俊     分类: Android


在实现安卓与PHP后台交互过程中,当安卓利用HttpPost去后台获取数据时,代码执行到下面这句就阻塞了:

<span style="font-size:14px;">httpClient.execute(httpPost);</span>

一开始找到资料说是新开一个线程执行上述语句,于是我便利用如下方式尝试了:

<span style="font-size:14px;">new Thread() {
<span style="white-space:pre">  </span>public void run(){
<span style="white-space:pre">      </span>try {
    <span style="white-space:pre">      </span>HttpResponse response = httpClient.execute(httpPost);
    <span style="white-space:pre">  </span>} catch (Exception e) {
        <span style="white-space:pre">  </span>e.printStackTrace();
    <span style="white-space:pre">  </span>}  
    }
}.start();
                </span>

这个的确可以解决 HttpClient.execute() 的阻塞问题,但是在不同的线程中执行代码时,由于代码执行的时间不一样,这便容易产生数据不一致的问题,比如我现在要登录,一开始输入的帐号密码是正确的,但是点击登录之后没响应。接着我又输了个错误的帐号密码然后登录,结果竟然能登录。


因此后来换用了一个办法,即在安卓主线程或者任何一个其他的子线程中加入以下代码,不用另开线程也能解决 HttpClient.execute 的阻塞问题:

<span style="font-size:14px;">StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
        .detectDiskReads()
        .detectDiskWrites()
        .detectNetwork()
        .penaltyLog()
        .build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedSqlLiteObjects()
                .detectLeakedClosableObjects()
                .penaltyLog()
                .penaltyDeath()
                .build());</span>


貌似在安卓4.0开始,谷歌就已经对“在主线程中直接访问网络”等做法进行了限制,也就是为什么我们没用新线程执行execute语句时会造成阻塞。而我们用上面的StrictMode(严苟模式)正是针对此问题的。

标签: android

热门推荐