【问题标题】:How to cancel an Android AsyncTask after a certain amount of time? (Eg. 10 seconds)如何在一定时间后取消 Android AsyncTask? (例如 10 秒)
【发布时间】:2012-04-08 00:44:23
【问题描述】:

我想使用 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

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    回答你的问题。与 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();
    }
    

    【讨论】:

      【解决方案2】:

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

      向这个 Handler 发送延迟消息,例如:

      Handler.sendMessageDelayed(msg, delayMillis)
      
      private android.os.Handler mHandler = new android.os.Handler() {
      
          @Override
          public void handleMessage(Message msg) {
              (Your AsyncTask object).cancel(true);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 2011-05-09
        • 1970-01-01
        相关资源
        最近更新 更多