2016-03-22 3 views
2

Я разрабатываю приложение для Android, которое отображает некоторые изображения с веб-сайта в MainActivity. Существуют и другие действия, которые в основном касаются автономного содержимого, например, работы с базой данных и конфигурацией.Multi Threading в Android

В настоящее время приложение сконструировано таким образом, что, когда оно переходит от MainActivity к любым другим действиям, сначала оно уничтожит себя (вызывается finish()), а затем перемещается. Аналогично, если перейти к MainActivity из какой-либо другой Activity, эти действия будут уничтожены до перемещения.

Приложение работает нормально, изначально. Но если пользователь слишком часто перемещается между действиями, задача загрузки изображений на главной странице занимает очень много времени.

For Example, if user navigates like 
MainActivity --> Activity1 --> MainActivity 

В приведенном выше случае нет проблемы с отображением изображений в MainActivity изначально. Но в следующем случае это занимает необычное время.

Что я планирую реализовать многопотоковый сценарий, который будет создавать новый поток каждый раз, когда приложение trie перейдет на 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

В целом с Android вы создаете новую «Thread», когда у вас есть задание, которое вам нужно сделать. Загрузка изображения, например. Этот «Thread» отправит обратно в поток пользовательского интерфейса, чтобы дать ему информацию для обновления, скажем, «ImageView». Почему вы создаете новые темы? – Knossos

ответ

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) 
0

Возможно, наилучшим способом реализации такого поведения является использование AsyncTask. Вы можете запустить его как этот

new YourAsyncTask().execute(); 

Отменить это так:

mTask.cancel(true); 

И вы можете использовать его doInBackground(), onProgressUpdate() и onPostExecute(), чтобы сделать его выполнять, как вы хотите (каждый метод в значительной степени за себя по самому названию).

0

Реализована логика кэш-памяти при загрузке изображений. Таким образом, если загрузка будет загружена, она не будет загружаться снова, вместо этого она (одно действие или другое) будет выглядеть в кеше.

+0

Содержимое изображений меняется каждую секунду. Поэтому мне нужны последние изображения всегда. Поэтому использование кеша может не решить проблему. Спасибо за предложение, хотя :) – Biswajit

0
  • BaseActivity класс, который распространяется Activity/AppCompatActivity.
  • продлить BaseActivity класс от MainActivity.
  • ли все задачи загрузки в BaseActivity с помощью AsyncTask

должен сделать трюк. :)

0

При загрузке изображения часто создания/разрушив Thread не будет хороший подход с учетом накладных расходов на создание и уничтожение. AsyncTask - это подход OK, но опасный для утечек памяти. Мое предложение состояло в том, чтобы обрабатывать задачи загрузки изображений в службе, например, IntentService, или создать обычный Service с фоновым потоком.