выполнение asyncTask-a при запуске приложения

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

выполнение asyncTask-a при запуске приложения

Сообщение Rustam » 03 сен 2014, 14:18

Доброго времени суток!
Нач условия: есть данные которые необходимо обновлять при запуске приложения (то есть проверяем их на устаревание и подгружаем, если надо)

Делаю так: в методе Create я подгружаю их asynctask-ом, в прогрессе пишу % выполнения

Вопрос:возникает ситуация подтипа зависания, при запуске белый экран - в этот момент грузятся данные и потом выплывает Toast с 100%, как сделать так, чтобы отобразился начальный layout и потом уже вызвался asynctask и нормально отобразил 0..100% загрузки??

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: выполнение asyncTask-a при запуске приложения

Сообщение anber » 03 сен 2014, 16:52

код покажи
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Re: выполнение asyncTask-a при запуске приложения

Сообщение Rustam » 03 сен 2014, 17:10

anber писал(а):код покажи

Код: Выделить всё

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//проверка даты создания данных
        check_data CD;
        CD=new check_data();
        CD.run();
        
        if (!check_data) {
        	user_choice=1;
        }else {
        	user_choice=0;
        }
        
        //функция загрузки элементов с сети 
        ArListSaleElement=new ArrayList<SaleElement>();
        ArListSaleElement=load_sale_image_list(user_choice);
}

//функция зарузки картинок
 public ArrayList<SaleElement> load_sale_image_list(int choice){
	 ArrayList<SaleElement> _saleImageArrayList;
     ArrayList<Bitmap> ArListBitmap;//временный массив картинок 
     SaleElement SE;//вспом текущий элемент
     Boolean load_from=false;//true-загрузка с устройства,false-загрузка с инета
     
     _saleImageArrayList=new ArrayList<SaleElement>();
     
     if (choice==0){load_from=true;};
     if (choice==1){load_from=false;};
     
     if (load_from){
    	 //загрузка с устройства
    	 Sale_image_load_from_disk SILFD=new Sale_image_load_from_disk();
    	 //выполняем асинктаск
    	 SILFD.execute();
    	 try {
    		 //пробуем получить значения
			_saleImageArrayList=SILFD.get();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
     }else {
    	 //загрузка с интернета-
    	 loadDataFromInet LDFI=new loadDataFromInet();
    	 LDFI.execute();
    	 try {
			_saleImageArrayList=LDFI.get();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
     }
	return _saleImageArrayList;//возвращаем занчение
	 
 }


//Загрузка данных с интернета
    public class loadDataFromInet extends
	AsyncTask<Void, Integer, ArrayList<SaleElement>> {
	
    	@Override
    	protected void onPreExecute() {
    		super.onPreExecute();
    		toast.setText("loading from inet...");
    		toast.show();    	
    	}

    	@Override
    	protected ArrayList<SaleElement> doInBackground(Void... params) {
    		// TODO Auto-generated method stub
    		Bitmap bmp;//вспомогательная переменная для загрузки картинки
    		SaleElement SE;//элемент массива
    		ArrayList<SaleElement> resultArraySE;//результат - массив 
    		ArrayList<Bitmap> ArBMP;//вспом - для массива картинок 
    		int progress=0;//для отображения прогресса
    		int dprogress=0;//прирост прогресса
    		//временный архив для хранения кол-ва картинок 
    		ArrayList<Integer> saleList;
    		//инициализация
    		resultArraySE=new ArrayList<SaleElement>();
     		ArBMP=new ArrayList<Bitmap>();
    		saleList=new ArrayList<Integer>();
    		resultArraySE=new ArrayList<SaleElement>();
    		bmp=Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
    		
    		
    		URL urlDataFile;
			try {
				urlDataFile = new URL(parentDir+dataPath);//URL ссылка
				//открыть поток с URL
				InputStream iStream=urlDataFile.openConnection().getInputStream();
				//открываем Data поток 
	    		DataInputStream DIS=new DataInputStream(iStream);
	    		String dataString=DIS.readLine();//построковое чтение
	    		if (dataString.equals("SALE")){//если нужный раздел то читаем
	    			dataString=DIS.readLine();//читаем до конца раздела
	    			while(!dataString.equals("ENDSALE")){
	    				saleList.add(Integer.parseInt(dataString));//получаем кол-во BMP
	    				dataString=DIS.readLine();//следующая строка
	    			}
	    		//для прогресса подсчет кол-ва картинок для загрузки
	    		for (int cnt=0;cnt<saleList.size();cnt++){
	    			progress=progress+saleList.get(cnt);
	    		}
	    		progress=progress+saleList.size();
	    		dprogress=(Integer)100/progress;
	    		progress=0;
	    		//блок чтения самих картинок
	    		for (int mag=0;mag<saleList.size();mag++){
	    			for (int pic=0;pic<=saleList.get(mag);pic++){
	    				//путь к каждому файлу
	    				String pathSaleFile=parentDir+"mag"+Integer.toString(mag)+"sale"+
	    						Integer.toString(pic)+".jpg";
	    				//получаем картинку по пути
	    				bmp=BitmapFactory.decodeStream(
	    						(InputStream) new 
	    						URL(pathSaleFile).getContent());
	    				//преобразуем к норм виду
	    				Bitmap bmpRet=Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888);
	    				bmpRet=Bitmap.createScaledBitmap(bmp, 400, 400, false);
	    				//добавляем в массив
	    				ArBMP.add(bmpRet);
	    				//показываем прогресс загрузки
	    				progress=progress+dprogress;
	    				publishProgress(progress);
	    			}
	    			//создаем элемент
	    			SE=new SaleElement(Integer.toString(mag), ArBMP, true);
	    			//и добавляем его
	    			resultArraySE.add(SE);
	    			//почистить массив картинок 
	    			ArBMP.clear();
	    		}
	    		}
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    		
    		return resultArraySE;
    	}

    	@Override
    	protected void onProgressUpdate(Integer... values) {
    		super.onProgressUpdate(values);
    		
    		toast.setText(values[0]+"%...");
    		toast.show();
    	}

    }
    

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: выполнение asyncTask-a при запуске приложения

Сообщение anber » 03 сен 2014, 17:25

Названия переменных у тебя просто ппц.
На первый взгляд все ок. Убедись что в методах onStart() и onResume() ничего долгого не выполняется.Далее попробуй убрать весь код из doInBackground() и убедиться что именно он виноват в зависании. Если не он - убирай куски кода один за другим пока не найдешь причину.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Re: выполнение asyncTask-a при запуске приложения

Сообщение Rustam » 03 сен 2014, 17:28

anber писал(а):Названия переменных у тебя просто ппц.
На первый взгляд все ок. Убедись что в методах onStart() и onResume() ничего долгого не выполняется.Далее попробуй убрать весь код из doInBackground() и убедиться что именно он виноват в зависании. Если не он - убирай куски кода один за другим пока не найдешь причину.
про названия согласен ))) потом если руки дойдут поправлю ))

в методах onStart() и onResume() - вообще ничего нет - я их не переписывал
а белый экран именно с тем связан, что, как я понимаю, происходит загрузка с инета
и asynctask запускается именно в методе onCreate();

попробую вызывать его иначе в другом месте (((

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: выполнение asyncTask-a при запуске приложения

Сообщение KamiSempai » 04 сен 2014, 17:11

Что это?
[syntax=java] check_data CD;
CD=new check_data();
CD.run(); [/syntax]
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Re: выполнение asyncTask-a при запуске приложения

Сообщение Rustam » 05 сен 2014, 07:52

KamiSempai писал(а):Что это?
[syntax=java] check_data CD;
CD=new check_data();
CD.run(); [/syntax]
проверка времени создания файлов, которые либо надо либо не надо обновлять

Код: Выделить всё

class check_data implements Runnable{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			
			File data_txt_path=new File(
					Environment.getExternalStorageDirectory().toString()+"/Acorz/");
			File data_txt=new File(data_txt_path,"data.txt");
			try {
				
				BufferedReader BR=new BufferedReader(new FileReader(data_txt));
				String date_str;
				date_str=BR.readLine();
				
				SimpleDateFormat SDF=new SimpleDateFormat("dd:MM:yy");
				Date data_date=new Date();
				data_date=SDF.parse(date_str);
				Date current_date=new Date();
				
				int days=(int) ((current_date.getTime()-data_date.getTime())/86400000);
				if (days>2){check_data=false;};//больше 2 дней значит надо подгружать
				BR.close();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
    	
    };
здесь ничего такого долгого нет

Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Re: выполнение asyncTask-a при запуске приложения

Сообщение Rustam » 05 сен 2014, 16:37

Сделал вот таки корявым способом
но иначе никак не получилось

Код: Выделить всё

service_st = 
        		Executors.newSingleThreadScheduledExecutor(); 
        final Runnable dataUPDT=new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				if (common_view.isShown()&!check_data){
					refreshData();
		    		check_data=true;
				}
				
			}
		};
		
		service_st.scheduleAtFixedRate(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				hand1.post(dataUPDT);
			}
		}, 3, 1, TimeUnit.SECONDS);
Есть ли способ проверить видимость компонента на экране, никак не нашел, вот только isShown() помог, но он дает true еще задолго как он отрисован, пришлось запускать сервис с задержкой в 3 сек.

если кто знает как сделать нормально, то очень жду )
смысл такой
при старте приложение проверяет состояние данных и если устарели то подгружает их выдав соответствующий AlertDialog
идея проста, но реализация капец отняла у меня неделю, чтобы я снова вернулся к процессам запускаемым по времени

Ответить