我有一个我执行的AsyncTask
类,它可以从网站上下载大量的数据。
如果最终用户在使用时数据连接非常慢或不稳定,我希望在一段时间后使AsyncTask
超时。我的第一种方法是这样的:
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
中的东西更适合这个目的?
发布于 2011-10-25 07:54:28
是的,有AsyncTask.get()
myDownloader.get(30000, TimeUnit.MILLISECONDS);
请注意,通过在主线程中调用它(AKA。UI线程)将阻塞执行,您可能需要在单独的线程中调用它。
发布于 2015-07-24 10:20:58
在onPreExecute()方法中AsyncTask的扩展类旁边使用CountDownTimer类:
主要优点是,异步监控在类内部完成。
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次。如果您想要添加一些监控,这是很好的。
感谢我在这个页面上得到的所有好的建议:-)
发布于 2014-03-20 14:20:20
在这种情况下,您的下载器基于URL连接,您有许多参数可以帮助您定义超时,而不需要复杂的代码:
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(15000);
urlc.setReadTimeout(15000);
如果你只是把这段代码带到你的异步任务中,这是可以的。
“读取超时”是在整个传输过程中测试一个坏的网络。
“'Connection”仅在开始时调用,用于测试服务器是否启动。
https://stackoverflow.com/questions/7882739
复制相似问题