Android 正在销毁线程,在滚动AbsListView期间

Android 正在销毁线程,在滚动AbsListView期间,android,Android,我想解决下一个问题,希望你们的帮助。我有一组图像的AbsListView。图像通过从互联网下载的背景线程膨胀。我创建这个线程,因为我不想妨碍UI线程。所以当用户滚动AbsListView时,我想销毁后台线程,并在停止滚动后启动它 要做到这一点,我至少需要重写onScroll方法,但我不知道应该在它的主体中写什么,因为当我尝试使用Thread.destroy()方法(不推荐使用)时,我得到了NoSuchMethodError 当我将onScroll定义为null时,它将下载的图像设置为滚动项目 请

我想解决下一个问题,希望你们的帮助。我有一组图像的AbsListView。图像通过从互联网下载的背景线程膨胀。我创建这个线程,因为我不想妨碍UI线程。所以当用户滚动AbsListView时,我想销毁后台线程,并在停止滚动后启动它

要做到这一点,我至少需要重写onScroll方法,但我不知道应该在它的主体中写什么,因为当我尝试使用Thread.destroy()方法(不推荐使用)时,我得到了NoSuchMethodError

当我将onScroll定义为null时,它将下载的图像设置为滚动项目


请告诉我如何处理这种情况。通常不建议通过扩展线程来使用线程功能。 Android有一个很棒的东西叫做AsyncTask

它易于使用,并且有一个方便的方法,例如.cancel();
如果java api方法被弃用,您不应该使用它。

通常不建议通过扩展线程来使用线程功能。 Android有一个很棒的东西叫做AsyncTask

它易于使用,并且有一个方便的方法,例如.cancel();
如果java api方法已被弃用,则不应使用它。

请参阅下面的文章,了解在java中停止
线程的方法的讨论


我不认为
AsyncTask
适合您的情况,因为
cancel()
方法实际上并没有停止
doInBackground()
中发生的处理,它只是防止调用
onPostExecute()
,而是调用
onCancelled()

请参阅下面的文章,了解在Java中停止
线程的方法


我不认为
AsyncTask
适合您的情况,因为
cancel()
方法实际上并没有停止
doInBackground()
中发生的处理,它只是防止调用
onPostExecute()
,而是调用
onCancelled()

都德请查看从web异步下载/缓存图像的库


一行代码。。就这么简单=)

都德,看看从web异步下载/缓存图像的库


一行代码。。很简单=)

我考虑过使用AsyncTask,但我的问题是,我的AbsListView中的每一项都有它的处理程序来处理后台线程发送的消息,我不知道如何将此机制应用于AsyncTask。但不管怎样,感谢您的响应。AsyncTask简化为与常规线程具有相同的功能。我不明白为什么你不能从doInBackground发布处理程序,就像你在常规线程中从run()发布一样。举个例子(不知道是否有用)。在我的一个应用程序中,我有一个视频拇指列表。列表中的数据集由具有标志(布尔拇指加载)的对象组成。活动也有一个拇指缓存。因此,当列表调用getView()时,它首先询问缓存是否有特定位置的拇指,如果没有,则询问对象(必须为此位置显示)是否正在加载拇指,如果为false,则启动异步任务加载此位置的拇指,并将标记thumbLoading设置为true。异步任务加载图像,将其放入缓存,更改标记,并调用notifyDataSetChanged()。getView()再次请求此位置,因为它已经在缓存中,所以只显示了图像。工作得很有魅力。但当然,这是一个相对较小的列表和小拇指。如果用户将一个很长的列表滚动到很长的长度,这个变量将占用处理器。但是如果我需要传递几个不同的对象,我应该如何使用AsyncTask对象,以便在doInBackground()中使用它?我考虑过AsyncTask使用,但我的问题是,AbsListView中的每一项都有它的处理程序来处理后台线程发送的消息,我不知道如何将这种机制应用于AsyncTask。但不管怎样,感谢您的响应。AsyncTask简化为与常规线程具有相同的功能。我不明白为什么你不能从doInBackground发布处理程序,就像你在常规线程中从run()发布一样。举个例子(不知道是否有用)。在我的一个应用程序中,我有一个视频拇指列表。列表中的数据集由具有标志(布尔拇指加载)的对象组成。活动也有一个拇指缓存。因此,当列表调用getView()时,它首先询问缓存是否有特定位置的拇指,如果没有,则询问对象(必须为此位置显示)是否正在加载拇指,如果为false,则启动异步任务加载此位置的拇指,并将标记thumbLoading设置为true。异步任务加载图像,将其放入缓存,更改标记,并调用notifyDataSetChanged()。getView()再次请求此位置,因为它已经在缓存中,所以只显示了图像。工作得很有魅力。但当然,这是一个相对较小的列表和小拇指。如果用户将一个很长的列表滚动到很长的长度,这个变量将占用处理器。但是如果我需要传递几个不同的对象,在doInBackground()中使用AsyncTask对象,我应该如何使用它呢?MayInterruptFrunning-如果执行此任务的线程应被中断,则为true;将其设置为
true
只会尝试中断后台任务,在我的测试中,它实际上从未成功完成。此外,在我看来,要以最有效的方式使用AsyncTask,我应该在我的活动中将其创建为内部类,这样我就可以再引用一次。@teoREtik,您不必将其作为内部类编写,您可以编写一个接受
上下文作为参数的构造函数,
execute()
方法将返回