如何在一定时间后取消Android AsyncTask? (例如10秒)

时间:2012-03-23 12:48:38

标签: android android-asynctask

我想使用AsyncTask来检查InetAddress,例如在下面的代码中。变量tempInet是一个全局变量,用于指示网站是否可以联系。

我用代码开始AsyncTask ... new InetAsyncTask()。execute(“www.facebook.com”);

我的问题是我希望AsyncTask在(比方说)10秒后自行取消。

其他一些问题建议使用get(10,TimeUnit.SECONDS)方法。我想这样做,但不知道在哪里/如何放置get方法。有执行吗?在doInBackground方法中?

此外,get()方法是否阻止主线程?如果有,那有什么意义呢?

任何帮助表示感谢。

 class InetAsyncTask extends AsyncTask<String, String, Boolean> {



    @Override
    protected Boolean doInBackground(String... params) {

        try {                 
                InetAddress.getByName("www.facebook.com");
                return true;          

                } catch (UnknownHostException e) {  
                  return false;
                }

    } //end doInBackground function



    protected void onPostExecute(Boolean... result) {

           tempInet = result[0];

    }


   } //end class

相关问题

Android - Setting a Timeout for an AsyncTask?

stop async task after 60 second

Android开发者AsyncTask文档

http://developer.android.com/reference/android/os/AsyncTask.html

2 个答案:

答案 0 :(得分:1)

你应该创建一个取消Asynctask的处理程序(http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean))

向此处理程序发送延迟消息,如:

Handler.sendMessageDelayed(msg, delayMillis)

private android.os.Handler mHandler = new android.os.Handler() {

    @Override
    public void handleMessage(Message msg) {
        (Your AsyncTask object).cancel(true);
    }
}

答案 1 :(得分:0)

回答你的问题。与get()一起使用的代码如下:

Boolean isHost = new AsyncTask<String, Void, Boolean>() {
            @Override
            protected Boolean doInBackground(String... params) {
                try {                 
                    InetAddress.getByName(params[0]);
                    return true;          
                } catch (UnknownHostException e) {  
                    return false;
                }
            }
        }.execute("www.facebook.com").get(PING_TIME, TimeUnit.MILLISECONDS);

只要需要返回结果,get方法就会阻塞调用者线程。因此,您应该只在测试情况下使用它。如果你想获得异步答案,请按以下步骤开始(这是我的一个例子,你必须为了你的目的而改变它):

private AsyncTask<Void, Void, Boolean> mAsyncTask;

private android.os.Handler timeHandler = new android.os.Handler() {
@Override
public void handleMessage(Message msg) {
        super.handleMessage(msg);
        // react here or...
        mAsyncTask.cancel(true);
    }
};

public void pingServer() {

    timeHandler.sendEmptyMessageDelayed(1, PING_TIME);        
    mAsyncTask = new AsyncTask<Void, Void, Boolean>() {
            @Override
            protected Boolean doInBackground(Void... params) {
                // stop the time handler
                timeHandler.removeMessages(1);
                return restService.pingServer();
            }

            @Override
            protected void onPostExecute(Boolean isOnline) {
                super.onPostExecute(isOnline);
                // use result after execution (e.g.: send to callback)
            }


            @Override
            protected void onCancelled(Boolean aBoolean) {
                super.onCancelled(aBoolean);
                // ...react here
            }
        }.execute();
}