我正在开发一款Android应用,它会在MainActivity网站上显示一些图片。还有一些其他活动基本上处理离线内容,如处理数据库和配置。
目前,App的设计方式是,当它从MainActivity导航到任何其他活动时,首先它会自行销毁(调用finish())然后导航。同样,如果从其他一些Activity导航到MainActivity,这些活动将在移动之前被销毁。
应用程序最初工作正常。但是如果用户过于频繁地在活动之间导航,那么主页面中的图像下载任务需要很长时间。
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
但我不知道如何实现同样的目标。任何建议或参考链接都是最受欢迎的。
答案 0 :(得分:1)
尝试使用像这样的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;
}
}
<强>活动:强>
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
task = new MyTask();
task.execute();
}
@Override
public void onDestroy() {
super.onDestroy();
if (task != null) task.cancel(true);
}
但对我来说,下载和显示图片的最简单方法是使用Picasso。
就这么简单:
Picasso.with(context)
.load(url)
.resize(50, 50)
.centerCrop()
.into(imageView)
答案 1 :(得分:0)
实现此类行为的最佳方法可能是使用AsyncTask。你可以像这样开始
new YourAsyncTask().execute();
取消它:
mTask.cancel(true);
您可以使用它doInBackground()
,onProgressUpdate()
和onPostExecute()
来使其按照您的意愿执行(每个方法都可以通过名称本身自我解释)。
答案 2 :(得分:0)
在加载图像时是否实现了缓存内存逻辑。因此,如果下载图像,则不会再次进行下载,而是(一个活动或另一个活动)将在缓存中查找。
答案 3 :(得分:0)
BaseActivity
。Activity/AppCompatActivity
类
BaseActivity
扩展MainActivity
课程。BaseActivity
AsyncTask
中完成所有下载任务
应该做的伎俩。 :)
答案 4 :(得分:0)
如果您经常加载图像,考虑到创建和销毁的开销,创建/销毁Thread
不是一个好方法。 AsyncTask
是一种可行的方法,但存在内存泄漏的风险。我的建议是在IntentService之类的服务中处理图像加载任务,或者使用后台线程创建常规Service。