Android中的多线程
我正在开发一个Android应用程序,它在MainActivity中显示一些来自网站的图像。还有一些基本上是处理脱机内容的活动,比如处理数据库和配置 目前,该应用程序的设计方式如下:当它从MainActivity导航到任何其他活动时,首先会销毁自身(调用finish()),然后再导航。同样,如果从其他活动导航到MainActivity,则这些活动将在移动之前被销毁 最初,应用程序运行良好。但是,如果用户在活动之间导航过于频繁,那么主页中的图像下载任务将花费很长时间Android中的多线程,android,multithreading,Android,Multithreading,我正在开发一个Android应用程序,它在MainActivity中显示一些来自网站的图像。还有一些基本上是处理脱机内容的活动,比如处理数据库和配置 目前,该应用程序的设计方式如下:当它从MainActivity导航到任何其他活动时,首先会销毁自身(调用finish()),然后再导航。同样,如果从其他活动导航到MainActivity,则这些活动将在移动之前被销毁 最初,应用程序运行良好。但是,如果用户在活动之间导航过于频繁,那么主页中的图像下载任务将花费很长时间 For Example, if
For Example, if user navigates like
MainActivity --> Activity1 --> MainActivity
在上述情况下,最初在MainActivity中显示图像没有问题。但在下一个例子中,这需要不同寻常的时间
我计划实现一个多线程场景,它将在应用程序每次尝试导航到MainActivity并销毁现有线程时创建一个新线程
Thread-0 : MainActivity --> Activity1 (to go Main) --> Kill Thread-0 and Create Thread-1
Thread-1 : MainActivity --> Activity1 --> Activity2 (to go to Main) --> Kill Thread-1 and create Thread-2
但我不知道如何实现同样的目标。任何建议或参考链接都是最受欢迎的。实现这种行为的最佳方法可能是使用。你可以这样开始
new YourAsyncTask().execute();
像这样取消它:
mTask.cancel(true);
您可以使用它的
doInBackground()
、onProgressUpdate()
和onPostExecute()
使其按您的意愿执行(每个方法的名称本身几乎是不言自明的).加载图像时是否实现了缓存逻辑。因此,如果图像被下载,它将不会再次进行下载,而是(一个活动或另一个活动)将在缓存中查找。- 创建扩展
的Activity/AppCompatActivity
类BaseActivity
- 从
扩展MainActivity
类BaseActivity
- 使用
AsyncTask
应该这样做。:) 尝试使用如下异步任务:
public class MyTask extends AsyncTask<Void, Void, Void> {
private volatile boolean running = true;
@Override
protected void onCancelled() {
running = false;
}
@Override
protected Void doInBackground(Void... params) {
while (running) {
// download
}
return null;
}
}
但对我来说,下载和显示图像最简单的方法是使用
就这么简单:
Picasso.with(context)
.load(url)
.resize(50, 50)
.centerCrop()
.into(imageView)
如果您经常加载图像,那么考虑到创建和销毁的开销,创建/销毁
线程将不是一个好方法AsyncTask
是一种正常的方法,但存在内存泄漏风险。我的建议是在一个服务中处理图像加载任务,比如一个或创建一个带有背景线程的常规线程。一般来说,在安卓系统中,当你有工作需要做时,你可以创建一个新的线程。例如,下载图像。该线程
将发回UI线程,为其提供更新信息,例如,图像视图
。为什么要制作新的线程?图像中的内容每秒都在变化。所以我总是需要最新的图片。因此,使用缓存可能无法解决问题。不过谢谢你的建议:)
Picasso.with(context)
.load(url)
.resize(50, 50)
.centerCrop()
.into(imageView)