问题
我有一个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
后,将启动一个新的处理程序,如果它仍在运行,将在30秒后取消AsyncTask
。
这是一个好方法吗?或者是否有内置于AsyncTask
的内容更适合此目的?
#1 热门回答(38 赞)
是的,有AsyncTask.get()
myDownloader.get(30000, TimeUnit.MILLISECONDS);
请注意,通过在主线程(AKA.UI线程)中调用它将阻止执行,你可能需要在单独的线程中调用它。
#2 热门回答(15 赞)
在这种情况下,你的下载程序基于URL连接,你有许多参数可以帮助你定义超时而无需复杂的代码:
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(15000);
urlc.setReadTimeout(15000);
如果你只是将此代码带入异步任务,那就没问题。
'Read Timeout'是在整个传输过程中测试一个糟糕的网络。
"连接超时"仅在开始时调用,以测试服务器是否启动。
#3 热门回答(15 赞)
在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次。如果要添加一些监视,这很好。
感谢你在此页面中获得的所有好建议:-)