Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中的多线程_Android_Multithreading - Fatal编程技术网

Android中的多线程

Android中的多线程,android,multithreading,Android,Multithreading,我正在开发一个Android应用程序,它在MainActivity中显示一些来自网站的图像。还有一些基本上是处理脱机内容的活动,比如处理数据库和配置 目前,该应用程序的设计方式如下:当它从MainActivity导航到任何其他活动时,首先会销毁自身(调用finish()),然后再导航。同样,如果从其他活动导航到MainActivity,则这些活动将在移动之前被销毁 最初,应用程序运行良好。但是,如果用户在活动之间导航过于频繁,那么主页中的图像下载任务将花费很长时间 For Example, if

我正在开发一个Android应用程序,它在MainActivity中显示一些来自网站的图像。还有一些基本上是处理脱机内容的活动,比如处理数据库和配置

目前,该应用程序的设计方式如下:当它从MainActivity导航到任何其他活动时,首先会销毁自身(调用finish()),然后再导航。同样,如果从其他活动导航到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

但我不知道如何实现同样的目标。任何建议或参考链接都是最受欢迎的。

实现这种行为的最佳方法可能是使用。你可以这样开始

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)