Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
5 / 5 / 3
Регистрация: 14.02.2013
Сообщений: 232
1

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

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

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

Вопрос: Как из MainActivity определить что ImageLoader завершил свою работу???
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2014, 15:08
Ответы с готовыми решениями:

[UWP] Существует ли способ узнать, что работу приложения завершил пользователь?
Если это десктопное приложение, то нажал на крестик в правом верхнем углу окна или нажал Alt+F4....

Можно ли как-то узнать, что некий запущенный процесс аварийно завершил работу?
а можно ли как-то узнать, что некий запущенный процесс аварийно завершил работу? (или его...

AsyncTask и Activity
Здравствуйте! Назрел новый вопрос. Когда запускаешь асинхронную задачу в методе onCreate(),...

Избежать запуска метода по таймеру, если он не завершил работу
Нужно реализовать такую задачу Каждую 5 секунд по Sytem.Timers.Timer вызывается метода скажем...

21
Android
245 / 242 / 52
Регистрация: 19.01.2013
Сообщений: 1,896
Записей в блоге: 3
16.09.2014, 15:13 2
типо того чтоли ?:

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

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

Добавлено через 1 минуту
Статус тру я могу поставить в начале а вот фолс куда поставить не понятно((
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
16.09.2014, 15:20 4
прицепиться к этому потоку типа так
Java
1
myImageLoader.join();
или проверять, существует ли тред
Java
1
myImageLoader.isAlive();
первое, что пришло в голову
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
16.09.2014, 15:54 5
Паблито, join из ui повесит его.
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
16.09.2014, 16:12 6
не учел
тогда запустить отдельный поток и из него делать join, особой нагрузки это не должно создать
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
16.09.2014, 16:17 7
Я думаю, что в этом случае пригодится интерфейс в качестве callback-а.
Java
1
2
3
4
public interface LoaderListener {
    void onBegin();
    void onLoadComplete();
}
и прокинуть его в ImageLoader. Но только в том случае, если ImageLoader запрашивается в activity. иначе придётся костылять ))
0
5 / 5 / 3
Регистрация: 14.02.2013
Сообщений: 232
16.09.2014, 16:32  [ТС] 8
Я не особо силен. AsyncTask это поток с doinbackground. onpostexecute, onpreexecyte и так далее. Но в ImageLoader нету AsyncTask там только всякие процедуры и функции....
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
16.09.2014, 16:38 9
cezer_ak, Покажите imageloader. Это Ваш или готовый чей-то?
0
5 / 5 / 3
Регистрация: 14.02.2013
Сообщений: 232
16.09.2014, 17:00  [ТС] 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. Надеюсь ничего не упустил)))
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
16.09.2014, 17:04 11
cezer_ak, а не хотите взять такую? https://github.com/nostra13/Android-Universal-Image-Loader
0
5 / 5 / 3
Регистрация: 14.02.2013
Сообщений: 232
16.09.2014, 17:09  [ТС] 12
С удовольствием взял бы только уже все готово осталась только проверку выполнения сделать. Для чего нужна проверка могу обьяснить: у меня во время загрузки данных с сервера появляется прогресс диалог но он завершается раньше чем загрузятся изображения. Т.е. Текст загрузился прогресс диалог пропал. А изображения еще не загруженны и подгружаются.
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
16.09.2014, 17:14 13
cezer_ak, тогда это проблемка...) надо как-то мониторить очередь в executor-е. И когда она пустая сообщать об этом.
0
5 / 5 / 3
Регистрация: 14.02.2013
Сообщений: 232
16.09.2014, 17:19  [ТС] 14
А с имэйдждоадером не прокатит проверка завершен он или нет?
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
16.09.2014, 17:24 15
Цитата Сообщение от cezer_ak Посмотреть сообщение
executorService.submit(new PhotosLoader(p));
Создаётся список тасок (пул потоков) и довольно тяжело отследить когда они завершаются.
0
5 / 5 / 3
Регистрация: 14.02.2013
Сообщений: 232
16.09.2014, 21:16  [ТС] 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(); в начале кода я прописал а вот вторую функцию куда поставить не знаю(((
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
17.09.2014, 09:23 17
Цитата Сообщение от cezer_ak Посмотреть сообщение
У меня в LisstView -> ImageView храниться статичная картинка с одним и тем же названием и она заменяется когда с сервера скачена картинка.
Ну вот значит вы знаете когда картинка скачалась, туда и повесьте вашу
Цитата Сообщение от cezer_ak Посмотреть сообщение
void testFunctionTwo();
0
5 / 5 / 3
Регистрация: 14.02.2013
Сообщений: 232
17.09.2014, 09:26  [ТС] 18
Да вот только проблема в том что в ListView очень много ImageView и их как то нужно сканировать в цикле а как я не знаю(
Точнее как осуществить простейший цикл в Потоке это я знаю.
- Но вот как вытянуть из каждого ImageView имя (123.jpg) загруженной в ней Image я не знаю(
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
17.09.2014, 09:29 19
Загрузка идет сразу на все ImageView одновременно?
0
5 / 5 / 3
Регистрация: 14.02.2013
Сообщений: 232
17.09.2014, 09:41  [ТС] 20
Нет цикл обрабатывает файл-> в файле находит URL-> Передаёт URL ImageDownloader-> ImageDownloader проверяет через FileCash(на существование кэша)->FileCash при условии что есть кэш картинки возвращает в цикл-> Если нет кэша возвращает в ImageDownloader-> ImageDownloader скачивает файл. Как то так)

Добавлено через 2 минуты
Когда кэш на все картинки существует то ProgressDialog завершается правильно. Но когда кэша нет то текст появляется в ListView ->Завершается ProgressDialog и на экране есть текст а картинки только начинают загружаться
0
17.09.2014, 09:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2014, 09:41
Помогаю со студенческими работами здесь

Невозможно обработать запрос, так как процесс (---) завершил свою работу
Здравствуйте знатоки. Написал я диспетчер, список процессов вывожу в листбокс, запросы на инфу о...

Узнать кто завершил процесс с использованием taskkill или чего-то подобного
Как узнать, имя учетной записи от имени которой завершается процесс (допустим, того же chrome.exe)...

Можно ли после того как серверный скрипт завершил свою работу, вызвать определнную процедуру из него клиентским скриптом?
В общем такой вопрос, можно ли после того как верверный скрипт завершил свою работу, вызвать...

Узнать текущую Activity
Всех с новым годом! Из главной активити запускается событие таймера. Скажите, как определить...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru