Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
#1

Узнать завершил ли работу Activity (не AsyncTask) - Android

16.09.2014, 15:08. Просмотров 1022. Ответов 21
Метки нет (Все метки)

Добрый день ув. Программисты.
- Имеется ImageLoader.java работает без AsyncTask.
- И Имеется MainActivity.java главная Activity.

Вопрос: Как из MainActivity определить что ImageLoader завершил свою работу???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2014, 15:08     Узнать завершил ли работу Activity (не AsyncTask)
Посмотрите здесь:

Android AsyncTask+CheckBox
Android Exception в AsyncTask
Android Работа с AsyncTask
Узнать текущую Activity Android
Android AsyncTask
Android AsyncTask и get()
AsyncTask Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ILNAR_93
Android
217 / 217 / 21
Регистрация: 19.01.2013
Сообщений: 1,593
Записей в блоге: 2
16.09.2014, 15:13     Узнать завершил ли работу Activity (не AsyncTask) #2
типо того чтоли ?:

Java
1
2
3
4
5
6
7
8
9
void ImageLoader()
{
status=true;
...
...
...
status=false;
 
}
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
16.09.2014, 15:16  [ТС]     Узнать завершил ли работу Activity (не AsyncTask) #3
Цитата Сообщение от ILNAR_93 Посмотреть сообщение
типо того чтоли ?:

Java
1
2
3
4
5
6
7
8
9
void ImageLoader()
{
status=true;
...
...
...
status=false;
 
}
Ага типа такого только в ImageLoader очень много процедур и функций который между собой пересекаются. и по Дэбагу так и не нашел где последний раз завершается действие... ((

Добавлено через 1 минуту
Статус тру я могу поставить в начале а вот фолс куда поставить не понятно((
Паблито
2017 / 1759 / 548
Регистрация: 12.05.2014
Сообщений: 6,240
Завершенные тесты: 1
16.09.2014, 15:20     Узнать завершил ли работу Activity (не AsyncTask) #4
прицепиться к этому потоку типа так
Java
1
myImageLoader.join();
или проверять, существует ли тред
Java
1
myImageLoader.isAlive();
первое, что пришло в голову
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
16.09.2014, 15:54     Узнать завершил ли работу Activity (не AsyncTask) #5
Паблито, join из ui повесит его.
Паблито
2017 / 1759 / 548
Регистрация: 12.05.2014
Сообщений: 6,240
Завершенные тесты: 1
16.09.2014, 16:12     Узнать завершил ли работу Activity (не AsyncTask) #6
не учел
тогда запустить отдельный поток и из него делать join, особой нагрузки это не должно создать
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
16.09.2014, 16:17     Узнать завершил ли работу Activity (не AsyncTask) #7
Я думаю, что в этом случае пригодится интерфейс в качестве callback-а.
Java
1
2
3
4
public interface LoaderListener {
    void onBegin();
    void onLoadComplete();
}
и прокинуть его в ImageLoader. Но только в том случае, если ImageLoader запрашивается в activity. иначе придётся костылять ))
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
16.09.2014, 16:32  [ТС]     Узнать завершил ли работу Activity (не AsyncTask) #8
Я не особо силен. AsyncTask это поток с doinbackground. onpostexecute, onpreexecyte и так далее. Но в ImageLoader нету AsyncTask там только всякие процедуры и функции....
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
16.09.2014, 16:38     Узнать завершил ли работу Activity (не AsyncTask) #9
cezer_ak, Покажите imageloader. Это Ваш или готовый чей-то?
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
16.09.2014, 17:00  [ТС]     Узнать завершил ли работу Activity (не AsyncTask) #10
Нет ImageLoader не мой, взят с просторов интернета. Суть его в загрузке изображений и кэширования с сохранением в память телефона.

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.widget.ImageView;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
 
public class ImageLoader {
    public boolean status;
 
    private static final String TAG = "MyApp";
    MemoryCache memoryCache=new MemoryCache();
    FileCache fileCache;
    private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
    ExecutorService executorService;
 
 
    public ImageLoader(Context context){
        fileCache=new FileCache(context);
        executorService=Executors.newFixedThreadPool(5);
        Log.d(TAG, "1");
    }
    
    final int stub_id = R.drawable.loading_ani;
 
 
 
    public void DisplayImage(String url, ImageView imageView)
    {
        status=true;
        imageViews.put(imageView, url);
        Bitmap bitmap=memoryCache.get(url);
        if(bitmap!=null)
 
            imageView.setImageBitmap(bitmap);
        else
        {
            queuePhoto(url, imageView);
            imageView.setImageResource(stub_id);
        }
        Log.d(TAG, "2");
    }
        
    private void queuePhoto(String url, ImageView imageView)
    {
        PhotoToLoad p=new PhotoToLoad(url, imageView);
        executorService.submit(new PhotosLoader(p));
        Log.d(TAG, "3");
 
    }
    
    private Bitmap getBitmap(String url) 
    {
        File f=fileCache.getFile(url);
        
        //from SD cache
        Bitmap b = decodeFile(f);
        if(b!=null)
            return b;
        
        //from web
        try {
            Bitmap bitmap=null;
            URL imageUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);
            conn.setInstanceFollowRedirects(true);
            InputStream is=conn.getInputStream();
            OutputStream os = new FileOutputStream(f);
            Utils.CopyStream(is, os);
            os.close();
            bitmap = decodeFile(f);
            Log.d(TAG, "4");
            return bitmap;
        } catch (Exception ex){
           ex.printStackTrace();
            Log.d(TAG, "5");
           return null;
 
        }
 
    }
 
    //decodes image and scales it to reduce memory consumption
    private Bitmap decodeFile(File f){
        try {
            //decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f),null,o);
            
            //Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE=70;
            int width_tmp=o.outWidth, height_tmp=o.outHeight;
            int scale=1;
            while(true){
                if(width_tmp/1040<REQUIRED_SIZE || height_tmp/530<REQUIRED_SIZE)
                    break;
                width_tmp/=1040;
                height_tmp/=530;
                scale*=2;
            }
            
            //decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;
            Log.d(TAG, "6");
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (FileNotFoundException e) {}
        Log.d(TAG, "7");
        return null;
    }
    
    //Task for the queue
    private class PhotoToLoad
    {
        public String url;
        public ImageView imageView;
        public PhotoToLoad(String u, ImageView i){
            url=u; 
            imageView=i;
            Log.d(TAG, "8");
        }
    }
    
    class PhotosLoader implements Runnable {
        PhotoToLoad photoToLoad;
        PhotosLoader(PhotoToLoad photoToLoad){
            this.photoToLoad=photoToLoad;
        }
        
        @Override
        public void run() {
            if(imageViewReused(photoToLoad))
                return;
            Bitmap bmp=getBitmap(photoToLoad.url);
            memoryCache.put(photoToLoad.url, bmp);
            if(imageViewReused(photoToLoad))
                return;
            BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
            Activity a=(Activity)photoToLoad.imageView.getContext();
            a.runOnUiThread(bd);
            Log.d(TAG, "9");
        }
    }
    
    boolean imageViewReused(PhotoToLoad photoToLoad){
        String tag=imageViews.get(photoToLoad.imageView);
        if(tag==null || !tag.equals(photoToLoad.url))
            return true;
        return false;
    }
    
    //Used to display bitmap in the UI thread
    class BitmapDisplayer implements Runnable
    {
        Bitmap bitmap;
        PhotoToLoad photoToLoad;
        public BitmapDisplayer(Bitmap b, PhotoToLoad p){bitmap=b;photoToLoad=p;}
        public void run()
        {
            if(imageViewReused(photoToLoad))
                return;
            if(bitmap!=null)
                photoToLoad.imageView.setImageBitmap(bitmap);
            else
                photoToLoad.imageView.setImageResource(stub_id);
 
        }
 
 
    }
    status=false;
 
    public void clearCache() {
        memoryCache.clear();
        fileCache.clear();
    }
 
}

Хотя я только сейчас увидел TreadPooll Tread это же и есть поток да?

Добавлено через 9 минут
Цитата Сообщение от YuraAAA Посмотреть сообщение
Но только в том случае, если ImageLoader запрашивается в activity. иначе придётся костылять ))
Последовательность такая: Запуск MainActivity->Запуск потока в MainActivity->LazyAdapter->ImageLoader->FileCash->Вывод Загруженых данных в ListView. Надеюсь ничего не упустил)))
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
16.09.2014, 17:04     Узнать завершил ли работу Activity (не AsyncTask) #11
cezer_ak, а не хотите взять такую? https://github.com/nostra13/Android-Universal-Image-Loader
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
16.09.2014, 17:09  [ТС]     Узнать завершил ли работу Activity (не AsyncTask) #12
С удовольствием взял бы только уже все готово осталась только проверку выполнения сделать. Для чего нужна проверка могу обьяснить: у меня во время загрузки данных с сервера появляется прогресс диалог но он завершается раньше чем загрузятся изображения. Т.е. Текст загрузился прогресс диалог пропал. А изображения еще не загруженны и подгружаются.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
16.09.2014, 17:14     Узнать завершил ли работу Activity (не AsyncTask) #13
cezer_ak, тогда это проблемка...) надо как-то мониторить очередь в executor-е. И когда она пустая сообщать об этом.
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
16.09.2014, 17:19  [ТС]     Узнать завершил ли работу Activity (не AsyncTask) #14
А с имэйдждоадером не прокатит проверка завершен он или нет?
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
16.09.2014, 17:24     Узнать завершил ли работу Activity (не AsyncTask) #15
Цитата Сообщение от cezer_ak Посмотреть сообщение
executorService.submit(new PhotosLoader(p));
Создаётся список тасок (пул потоков) и довольно тяжело отследить когда они завершаются.
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
16.09.2014, 21:16  [ТС]     Узнать завершил ли работу Activity (не AsyncTask) #16
А если пойти другим путем и в отдельном потоке в цикле проверять что то типа:
Если image into imageView <>ic_loading.gif тогда выключить progressdialog.

У меня в LisstView -> ImageView храниться статичная картинка с одним и тем же названием и она заменяется когда с сервера скачена картинка.

Но как тогда будет выглядеть этот самый цикл ?? Подскажите пожалуйста.

Добавлено через 3 часа 25 минут
Все мозги кипят... =(
Пробовал Колбэк:

Java
1
2
3
4
5
6
7
public interface Tester  {
 
    void testFunctionOne();
 
    void testFunctionTwo();
 
}
testFunctionOne(); в начале кода я прописал а вот вторую функцию куда поставить не знаю(((
Spelcrawler
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 1
17.09.2014, 09:23     Узнать завершил ли работу Activity (не AsyncTask) #17
Цитата Сообщение от cezer_ak Посмотреть сообщение
У меня в LisstView -> ImageView храниться статичная картинка с одним и тем же названием и она заменяется когда с сервера скачена картинка.
Ну вот значит вы знаете когда картинка скачалась, туда и повесьте вашу
Цитата Сообщение от cezer_ak Посмотреть сообщение
void testFunctionTwo();
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
17.09.2014, 09:26  [ТС]     Узнать завершил ли работу Activity (не AsyncTask) #18
Да вот только проблема в том что в ListView очень много ImageView и их как то нужно сканировать в цикле а как я не знаю(
Точнее как осуществить простейший цикл в Потоке это я знаю.
- Но вот как вытянуть из каждого ImageView имя (123.jpg) загруженной в ней Image я не знаю(
Spelcrawler
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 1
17.09.2014, 09:29     Узнать завершил ли работу Activity (не AsyncTask) #19
Загрузка идет сразу на все ImageView одновременно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2014, 09:41     Узнать завершил ли работу Activity (не AsyncTask)
Еще ссылки по теме:

AsyncTask Android
Android AsyncTask тормозит
Android Не работает AsyncTask
При открытии программы узнать данные, которые хранятся в второй форме Activity, не переходя на неё Android
Узнать будет ли Activity пересоздана Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
17.09.2014, 09:41  [ТС]     Узнать завершил ли работу Activity (не AsyncTask) #20
Нет цикл обрабатывает файл-> в файле находит URL-> Передаёт URL ImageDownloader-> ImageDownloader проверяет через FileCash(на существование кэша)->FileCash при условии что есть кэш картинки возвращает в цикл-> Если нет кэша возвращает в ImageDownloader-> ImageDownloader скачивает файл. Как то так)

Добавлено через 2 минуты
Когда кэш на все картинки существует то ProgressDialog завершается правильно. Но когда кэша нет то текст появляется в ListView ->Завершается ProgressDialog и на экране есть текст а картинки только начинают загружаться
Yandex
Объявления
17.09.2014, 09:41     Узнать завершил ли работу Activity (не AsyncTask)
Ответ Создать тему
Опции темы

Текущее время: 00:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru