2012-07-02 1 views
0

У меня возникла проблема с моим приложением. Я портирую серию внутренних iPad-приложений от iOS до android, а последовательности изображений являются неотъемлемой частью их дизайна. Они требуют стандартной полноэкранной остановки, запуска, паузы, все из которых отлично работают с подклассом ImageView. Но в настоящее время он отображает только 2 из 300 изображений, которые до него доходят до того, как диалог заблокированных процессов продолжает расти.Отображение изображений без блокировки «основной» нити

Так есть «хороший» способ установить изображение/фон без блокировки основной нити?

Just FYI AnimateDrawable не идеален для того, что мне нужно, поскольку оно не предлагает функциональность паузы/возобновления, а количество последовательностей, которые у меня есть, легко в сотнях и составляет в среднем несколько сотен кадров.

+0

Возможно, я не совсем понимаю вопрос, но можете ли вы запустить свой процесс в отдельном потоке, а затем вернуться к главному, чтобы обновить интерфейс? –

+0

Кажется, что проблема связана с загрузкой изображений. Таймер продолжает тикать, как нужно. Ури разрешается за много времени, но установка изображения, похоже, занимает возраст. В URL-адресах с разрешением 300 изображений, которые он проходит, перед сбоем отображается только одно изображение или два. Также ImageViews существуют в наборе инструментов пользовательского интерфейса, и в соответствии с документами мы не можем коснуться его вне основного потока. – Mytheral

ответ

1

Вы можете загружать изображения асинхронного с помощью AsyncTask

Просто поместите код, связанный с загрузкой изображений в doInBackground метода и попытаться установить индикатор, как индикатор выполнения или прогресс диалогового так начнете показывая диалоговое окно или панель в начале загрузки и после финиша закрыть диалоговое окно с помощью обработчиков в onPostExecute метода

Sample Код:

class SomeClass extends Activity { 
protected ProgressDialog pd ; 
protected Handler handler = new Handler(){ 
@Override 
public void handleMessage(int what){ 
    if(pd.isShowing()) 
     pd.dismiss(); 
} 
    ..... 

    class LoadImageTask extends AsyncTask<URL, Integer, Long> { 
      protected void onPreExecute(Long result) { 
      pd = ProgressDialog.show(getContext(),"Title","Message"); 
     } 

     protected Long doInBackground(URL... urls) { 

      //Load IMAGEs code 
      return totalSize; 
     } 



     protected void onPostExecute(Long result) { 
      //finish loadiing images 
       handler .sendEmptyMessage(0); 
     } 
    } 
    } 

Я надеюсь, что это поможет вам

0

Пара вещей, чтобы добавить ответ Муханнаду в:

  • Вы не обязательно должны сделать это в AsyncTask, поток будет делать ;
  • Возможно, вы захотите отобразить изображение в выделенном растровом изображении, а затем используйте Canvas.drawBitmap(), чтобы отобразить его на onDraw(), чтобы сэкономить время на рендеринг в потоке пользовательского интерфейса.