我制作了一个从我们的服务器上下载视频的应用。 问题是:
当我取消下载时,我打电话:
myAsyncTask.cancel(true)
我注意到,myAsyncTask
在调用取消时没有停止...我的ProgressDialog
仍然上升,就像从状态跳到状态一样,每次我取消并重新开始AsyncTask
点击下载按钮,新AsyncTask
开始...
每次我点击下载..然后取消,然后再次下载单独的AsyncTask
开始。
为什么myAsynTask.cancle(true)
没有取消我的任务?我不再想要它了。如果我点击取消,我只想完全关闭它。
怎么做?
E D I T:
感谢gtumca-MAC,以及其他帮助过我的人:
while (((count = input.read(data)) != -1) && (this.isCancelled()==false))
{
total += count;
publishProgress((int) (total * 100 / lenghtOfFile));
output.write(data, 0, count);
}
感谢!!!
答案 0 :(得分:53)
AsyncTask不会取消
上的进程myAsynTask.cancel(true)
为此你必须手动停止它。
例如,您正在{/ 1}}下载while / for循环中的视频。
doInBackground(..)
答案 1 :(得分:4)
在你的班级宣布
DownloadFileAsync downloadFile = new DownloadFileAsync();
然后在创建
DownloadFileAsync downloadFile = new DownloadFileAsync();
downloadFile.execute(url);
在你的背景中()
if (isCancelled())
break;
@Override
protected void onCancelled(){
}
你可以通过
杀死你的AsyncTaskdownloadFile.cancel(true);
答案 2 :(得分:1)
当你启动一个单独的线程(AyncTask)时,它必须完成。您必须手动将取消语句添加到AsyncTask内的代码中。
可以通过调用cancel(boolean)随时取消任务。调用此方法将导致后续调用isCancelled()返回true。调用此方法后,将在doInBackground(Object [])返回后调用onCancelled(Object)而不是onPostExecute(Object)。为确保尽快取消任务,应始终定期从doInBackground(Object [])检查isCancelled()的返回值(如果可能)(例如在循环内)。
在文档中查看更多内容:http://developer.android.com/reference/android/os/AsyncTask.html
答案 3 :(得分:0)
我一直在研究过去两周,我不知道我们如何手动杀死异步操作。一些开发人员使用BREAK;在检查循环时。但在我的场景中,我没有在后台线程中使用循环。 但我必须知道它是如何制作一个愚蠢的逻辑,但工作得非常好。
downloadFile.cancel(true); //This code wont work in any case.
而不是取消并在后台线程上做这么多工作,而不是以编程方式关闭wifi
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(false);
你想在哪里杀死它并在你需要的地方打开它。
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(true);
您的try块会跳转到IOException,从而导致后台任务崩溃。
答案 4 :(得分:0)
您最好使用vogella asyncTask库,它具有许多功能,如优先级和取消后台任务。一个很好的教程或使用它是here
答案 5 :(得分:0)
您可以使用此代码。我正在下载OTA文件,如下所示:
fDownload.cancel(true);
所以,如果你想取消,只需使用这段代码:
{{1}}
答案 6 :(得分:0)
我在使用TextView onclick ...
的活动中成功使用 //inside the doInBackground() ...
try {
while (true) {
System.out.println(new Date());
//should be 1 * 1000 for second
Thread.sleep(5 * 1000);
if (isCancelled()) {
return null;
}
}
} catch (InterruptedException e) {
}
和我的onCreate()......
//set Activity
final SplashActivity sPlashScreen = this;
//init my Async Task
final RetrieveFeedTask syncDo = new RetrieveFeedTask();
syncDo.execute();
//init skip link
skip_text = (TextView) findViewById(R.id.skip_text);
skip_text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//cancel Async
syncDo.cancel(true);
//goto/start another activity
Intent intent = new Intent();
intent.setClass(sPlashScreen, MainActivity.class);
startActivity(intent);
finish();
}
});
和我的xml TextView元素......
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/skip_text"
android:layout_marginTop="20dp"
android:text="SKIP"
android:textColor="@color/colorAccent"/>