Страница 1 из 1
выполнение asyncTask-a при запуске приложения
Добавлено: 03 сен 2014, 14:18
Rustam
Доброго времени суток!
Нач условия: есть данные которые необходимо обновлять при запуске приложения (то есть проверяем их на устаревание и подгружаем, если надо)
Делаю так: в методе Create я подгружаю их asynctask-ом, в прогрессе пишу % выполнения
Вопрос:возникает ситуация подтипа зависания, при запуске белый экран - в этот момент грузятся данные и потом выплывает Toast с 100%, как сделать так, чтобы отобразился начальный layout и потом уже вызвался asynctask и нормально отобразил 0..100% загрузки??
Re: выполнение asyncTask-a при запуске приложения
Добавлено: 03 сен 2014, 16:52
anber
код покажи
Re: выполнение asyncTask-a при запуске приложения
Добавлено: 03 сен 2014, 17:10
Rustam
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();
}
}
Re: выполнение asyncTask-a при запуске приложения
Добавлено: 03 сен 2014, 17:25
anber
Названия переменных у тебя просто ппц.
На первый взгляд все ок. Убедись что в методах onStart() и onResume() ничего долгого не выполняется.Далее попробуй убрать весь код из doInBackground() и убедиться что именно он виноват в зависании. Если не он - убирай куски кода один за другим пока не найдешь причину.
Re: выполнение asyncTask-a при запуске приложения
Добавлено: 03 сен 2014, 17:28
Rustam
anber писал(а):Названия переменных у тебя просто ппц.
На первый взгляд все ок. Убедись что в методах onStart() и onResume() ничего долгого не выполняется.Далее попробуй убрать весь код из doInBackground() и убедиться что именно он виноват в зависании. Если не он - убирай куски кода один за другим пока не найдешь причину.
про названия согласен ))) потом если руки дойдут поправлю ))
в методах onStart() и onResume() - вообще ничего нет - я их не переписывал
а белый экран именно с тем связан, что, как я понимаю, происходит загрузка с инета
и asynctask запускается именно в методе onCreate();
попробую вызывать его иначе в другом месте (((
Re: выполнение asyncTask-a при запуске приложения
Добавлено: 04 сен 2014, 17:11
KamiSempai
Что это?
[syntax=java] check_data CD;
CD=new check_data();
CD.run(); [/syntax]
Re: выполнение asyncTask-a при запуске приложения
Добавлено: 05 сен 2014, 07:52
Rustam
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();
}
}
};
здесь ничего такого долгого нет
Re: выполнение asyncTask-a при запуске приложения
Добавлено: 05 сен 2014, 16:37
Rustam
Сделал вот таки корявым способом
но иначе никак не получилось
Код: Выделить всё
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
идея проста, но реализация капец отняла у меня неделю, чтобы я снова вернулся к процессам запускаемым по времени