首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >安卓-为AsyncTask设置超时?

安卓-为AsyncTask设置超时?
EN

Stack Overflow用户
提问于 2011-10-25 06:32:44
回答 7查看 75K关注 0票数 127

我有一个我执行的AsyncTask类,它可以从网站上下载大量的数据。

如果最终用户在使用时数据连接非常慢或不稳定,我希望在一段时间后使AsyncTask超时。我的第一种方法是这样的:

代码语言:javascript
复制
MyDownloader downloader = new MyDownloader();
downloader.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
  @Override
  public void run() {
      if ( downloader.getStatus() == AsyncTask.Status.RUNNING )
          downloader.cancel(true);
  }
}, 30000 );

在启动AsyncTask之后,将启动一个新的处理程序,如果AsyncTask仍在运行,该处理程序将在30秒后取消它。

这是一种好的方法吗?或者,有没有什么内置在AsyncTask中的东西更适合这个目的?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-10-25 07:54:28

是的,有AsyncTask.get()

代码语言:javascript
复制
myDownloader.get(30000, TimeUnit.MILLISECONDS);

请注意,通过在主线程中调用它(AKA。UI线程)将阻塞执行,您可能需要在单独的线程中调用它。

票数 44
EN

Stack Overflow用户

发布于 2015-07-24 10:20:58

在onPreExecute()方法中AsyncTask的扩展类旁边使用CountDownTimer类:

主要优点是,异步监控在类内部完成。

代码语言:javascript
复制
public class YouExtendedClass extends AsyncTask<String,Integer,String> {
...
public YouExtendedClass asyncObject;   // as CountDownTimer has similar method -> to prevent shadowing
...
@Override
protected void onPreExecute() {
    asyncObject = this;
    new CountDownTimer(7000, 7000) {
        public void onTick(long millisUntilFinished) {
            // You can monitor the progress here as well by changing the onTick() time
        }
        public void onFinish() {
            // stop async task if not in progress
            if (asyncObject.getStatus() == AsyncTask.Status.RUNNING) {
                asyncObject.cancel(false);
                // Add any specific task you wish to do as your extended class variable works here as well.
            }
        }
    }.start();
...

例如,更改CountDownTimer(7000,7000) -> CountDownTimer(7000,1000),它将在调用onFinish()之前调用onTick() 6次。如果您想要添加一些监控,这是很好的。

感谢我在这个页面上得到的所有好的建议:-)

票数 21
EN

Stack Overflow用户

发布于 2014-03-20 14:20:20

在这种情况下,您的下载器基于URL连接,您有许多参数可以帮助您定义超时,而不需要复杂的代码:

代码语言:javascript
复制
  HttpURLConnection urlc = (HttpURLConnection) url.openConnection();

  urlc.setConnectTimeout(15000);

  urlc.setReadTimeout(15000);

如果你只是把这段代码带到你的异步任务中,这是可以的。

“读取超时”是在整个传输过程中测试一个坏的网络。

“'Connection”仅在开始时调用,用于测试服务器是否启动。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7882739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档