چگونه اپليكيشن خود را كارامد تر و سريعتر كنيم؟ (حل شد)
سلام و روزخوش به همگي
دوستان من توي برنامه ام چندتا اسپينر و ليست ويو دارم و يه ديتابيس لوكال، اينا چندبار هي ميرن از ديتابيس كوئري ميگيرن.
فرض كنيد ديتابيس من 50000 هزارتا ركورد داره، خوب تا اين cursere بدبخت بره لاي اينا اون ركورد برگردونه 2روز طول ميكشه ديگه! ميخوام تا اين ميره و برگرده بجاي اينكه برنامه من بقول معروف فيريز بشه، پنجره لودينگ منتظر بمانيد ظاهر بشه!
كه كاربر فكر نكنه برنامه خرابه و بخواد گير بده (البته حف هم با اونه)
حالا دوستان راه حل چيه؟ من چيكار كنم كه اين پراسس ديتابيس باعث فيريز شدن برنامه نشه و برنامه مثلا يه دايلاگ باكس لود ظاهر بشه بگه چن لحظه منتظر بمانيد!؟؟؟؟
پياپيش از همكاري و همفكري شما سپسا گذار و ممنونم.
ستاره بچينييييييييييييييييييييي بوس بوس ^_^
مشكل حل شد - راه حل
من اومدم از متد Asyntask استفاده كردم به شكل زير:
privateclass refreshCity extendsAsyncTask<String,String,Boolean>{
@Override
protectedvoid onPreExecute(){
super.onPreExecute();
//قبل از شروع پراسس
}
@Override
protectedBoolean doInBackground(String... args){
//عمل پراسس مورد نظر
returnfalse;
}
@Override
protectedvoid onPostExecute(Boolean th){
//پس از عمل پراسس
}
}
}
با استفاده از اين ميشه خيلي راحت كار كرد و برنامه رو از حالت freez درآورد. و يه برنامه دايناميك و عالي ارائه داد.
يكي از دوستان گفت كه از Threa استفاده كن، اسنفاده از Thread براي اين كار ديتابيس زياد جالب نبود و ترجيح دادم از Asyntask استفاده كنم
نكته مهم: مشكلي كه من داشتم اين بود با همين هم freez ميشد چون توي Asyntask از runOnUiThread استفاده كرده بودم كه برنامه كرش نكنه. (همونظور كه در پاسخ زير اينو نووشته بود). بجاي اينكار پراسس اصلي رو توي do in background انجام بدين و بعد از پايان پراسس وقتي قرار شد چيزي توي Ui ترد اصلي تغيير كنه اونهارو در onPostExecute انجام بدين.
جدا از همه اين موارد ميتونيد از كتابخونه هاي مختلفي هم واسه اتصال به دستابيس و كار با اون استفاده كنيد. مثل:
البته من هنوز با هيچكدوم كار نكردم، ممنون ميشم از دوستاني كه از اين كتابخونه يا چيز ديگه اي استفاده كردن راهنمايي كنن و طرز كار اينهارو آموزشي چيزي بدن!
ممنون و شب همگي خوش
اين روش غلطه، به پست بالا مراجعه كنيد!!!!
مشكل سرعت در اين مورد اين بود كه از متد runOnUiThread استفاده ميكردم و اون هم به اين علت بود كه من تمام كارهامو اعم از پراسس اصلي و تغيررات UI با داده هاي جديد از پراسس رو توي همون doinbackgroud انجام ميدادم و حواسم نبود. به همين دليل runOnUiThred گذاشته بودم كه كرش نكنه.
بجاي اينكار بهتره كه عمليتاي كه شامل تغييرات در ترد اصلي ميشه رو در onPostExecute انجام بدين!
دوستان من اينكارو طبق آموزش استاد يعني با استفاده از Thread ساختم
اما خوب بازم جواب نداد و اون freez شدنرو داشت
اما الان اومدم با استفاده از متد AsynTask اينكارو انجام دادم:
private class refreshCity extends AsyncTask<String,String,Boolean>{
@Override
protected void onPreExecute(){
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... args){
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
return false;}
@Override
protected void onPostExecute(Boolean th){
}
}
اما خوب با اين متد هم در راند اول همين مشكل رو دارم! اما توي 3تا راند بعدي خيلي خوب عمل ميكنه!
ميشه باز راه بهتري ارائه بدين يا بگين كه مشكل كجاست؟
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .