Android中的多线程

时间:2016-03-22 11:11:02

标签: android multithreading

我正在开发一款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

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

5 个答案:

答案 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