Android:Thread.sleep没有结束

时间:2012-09-28 07:56:17

标签: android multithreading sleep

我有一个带httprequest的应用。我想为该请求设置超时,并且因为我无法控制de DNS超时,所以stackoverflow中的用户建议创建一个带有计时器的线程以在一定时间后取消请求,这就是我正在做的事情。

在我的新线程中,我使用Thread.sleep等待30秒,当该时间结束时,取消请求,如果它还没有结束,但我的线程永远不会醒来。这是我的代码:

private Thread timeout_request = new Thread(new Runnable() {
    public void run() {
        try{
            Log.d(TAG, "Thread start");
            Thread.sleep(30000);
            Log.d(TAG, "Thread awake");
            if(!httprequest_finished){
                request_aborted = true;
                mHttpClient.getConnectionManager().shutdown();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
});

public String sendData(String token){
    ...
    timeout_request.start();
    Log.i(TAG, "Sending request");
    final HttpResponse resp = httpClient.execute(post);
    Log.i(TAG, "Execute finished");
    if(request_aborted) return null;
    httprequest_finished = true;
    ...
}

如果我执行没有互联网连接的sendData函数,日志显示“发送请求”和“线程启动”,但不显示“线程唤醒”或“执行完成”(我等了5分钟)。那是为什么?

------编辑------

顺便说一下,我不知道它是否重要,但我在我的连接中使用ThreadSafeClientConnManager。

我测试了一些东西:

1-用while(!request_aborted)替换HttpResponse resp = httpClient.execute(post)。线程醒来(它工作)。

2-使用mHandler.postDelayed(r,30000)代替线程。我还在执行httpClient.execute(post)。结果:Runnable未启动。

private Handler mHandler = new Handler();
private Runnable r = new Runnable() {
    public void run() {
        Log.d(TAG, "Runnable()");
        if(!httprequest_finished){
            request_aborted = true;
            mHttpClient.getConnectionManager().shutdown();
        }
    }
};

3-使用mHandler.postDelayed(r,30000)代替线程。用while(!request_aborted)替换HttpResponse resp = httpClient.execute(post)。结果:Runnable未启动。

因此,如果我没有执行http请求,则该线程可以工作,但处理程序永远不会工作。我在日志中注意到这些行:

threadid=3: reacting to signal 3
Wrote stack traces to '/data/anr/traces.txt'
threadid=3: reacting to signal 3
Wrote stack traces to '/data/anr/traces.txt'

执行线程或设置处理程序后6或7秒出现。我试过用:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
            Log.e("Alert","Lets See if it Works !!!");
        }
    });

但是日志从未显示“让我们看看它是否有效!!!”。我查看了traces.txt文件,我不明白它是什么 - ---

2 个答案:

答案 0 :(得分:0)

我测试了以下代码:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

/**
 *
 * @author paro
 */
public class JavaApplication1 {

    public boolean req_aborted = false;
    public Thread timeout_request = new Thread(new Runnable() {
    public void run() {
        try{
            System.out.println("start");
            Thread.sleep(30000);
            System.out.println("awake");
            if(req_aborted ==false)
            {
                req_aborted = true;
                System.out.println("flag change");
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
});
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        JavaApplication1 jap = new JavaApplication1();
        jap.timeout_request.start();
        System.out.println("requset started");
        if(jap.req_aborted)
        {
            System.out.println("flag is true now");
        }
    }
}

,输出

requset started
start
awake
flag change

似乎与代码中与线程相关的部分没有问题。

并且你的代码的逻辑说它应该打印“清醒”。好像你有以下陈述的问题

final HttpResponse resp = httpClient.execute(post);

答案 1 :(得分:0)

我认为您应该使用Thread.sleep,而不是使用Handler.postDelayed。看看documentation

类似的东西:

Handler mHandler = new Handler();
...
mhandler.postDelayed(new Runnable() {
    public void run() {
        if(!httprequest_finished){
            request_aborted = true;
            mHttpClient.getConnectionManager().shutdown();
        }
    }
}, 30000);

这将在指定的延迟后执行传入的Runnable