выполнение asyncTask-a при запуске приложения
выполнение asyncTask-a при запуске приложения
Доброго времени суток!
Нач условия: есть данные которые необходимо обновлять при запуске приложения (то есть проверяем их на устаревание и подгружаем, если надо)
Делаю так: в методе Create я подгружаю их asynctask-ом, в прогрессе пишу % выполнения
Вопрос:возникает ситуация подтипа зависания, при запуске белый экран - в этот момент грузятся данные и потом выплывает Toast с 100%, как сделать так, чтобы отобразился начальный layout и потом уже вызвался asynctask и нормально отобразил 0..100% загрузки??
Нач условия: есть данные которые необходимо обновлять при запуске приложения (то есть проверяем их на устаревание и подгружаем, если надо)
Делаю так: в методе Create я подгружаю их asynctask-ом, в прогрессе пишу % выполнения
Вопрос:возникает ситуация подтипа зависания, при запуске белый экран - в этот момент грузятся данные и потом выплывает Toast с 100%, как сделать так, чтобы отобразился начальный layout и потом уже вызвался asynctask и нормально отобразил 0..100% загрузки??
Re: выполнение asyncTask-a при запуске приложения
код покажи
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: выполнение asyncTask-a при запуске приложения
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 при запуске приложения
Названия переменных у тебя просто ппц.
На первый взгляд все ок. Убедись что в методах onStart() и onResume() ничего долгого не выполняется.Далее попробуй убрать весь код из doInBackground() и убедиться что именно он виноват в зависании. Если не он - убирай куски кода один за другим пока не найдешь причину.
На первый взгляд все ок. Убедись что в методах onStart() и onResume() ничего долгого не выполняется.Далее попробуй убрать весь код из doInBackground() и убедиться что именно он виноват в зависании. Если не он - убирай куски кода один за другим пока не найдешь причину.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: выполнение asyncTask-a при запуске приложения
про названия согласен ))) потом если руки дойдут поправлю ))anber писал(а):Названия переменных у тебя просто ппц.
На первый взгляд все ок. Убедись что в методах onStart() и onResume() ничего долгого не выполняется.Далее попробуй убрать весь код из doInBackground() и убедиться что именно он виноват в зависании. Если не он - убирай куски кода один за другим пока не найдешь причину.
в методах onStart() и onResume() - вообще ничего нет - я их не переписывал
а белый экран именно с тем связан, что, как я понимаю, происходит загрузка с инета
и asynctask запускается именно в методе onCreate();
попробую вызывать его иначе в другом месте (((
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: выполнение asyncTask-a при запуске приложения
Что это?
[syntax=java] check_data CD;
CD=new check_data();
CD.run(); [/syntax]
[syntax=java] check_data CD;
CD=new check_data();
CD.run(); [/syntax]
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: выполнение asyncTask-a при запуске приложения
проверка времени создания файлов, которые либо надо либо не надо обновлять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 при запуске приложения
Сделал вот таки корявым способом
но иначе никак не получилось
Есть ли способ проверить видимость компонента на экране, никак не нашел, вот только isShown() помог, но он дает true еще задолго как он отрисован, пришлось запускать сервис с задержкой в 3 сек.
если кто знает как сделать нормально, то очень жду )
смысл такой
при старте приложение проверяет состояние данных и если устарели то подгружает их выдав соответствующий AlertDialog
идея проста, но реализация капец отняла у меня неделю, чтобы я снова вернулся к процессам запускаемым по времени
но иначе никак не получилось
Код: Выделить всё
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);
если кто знает как сделать нормально, то очень жду )
смысл такой
при старте приложение проверяет состояние данных и если устарели то подгружает их выдав соответствующий AlertDialog
идея проста, но реализация капец отняла у меня неделю, чтобы я снова вернулся к процессам запускаемым по времени