PDA

View Full Version : کار تابع AsyncTask چیست



sara_traveler
سه شنبه 16 اردیبهشت 1393, 13:08 عصر
من چون میخوام به اسکیول وصل بشم باید دستوراتم داخل تابع زیر بنویسم واگرنه اجرا نمیشه

class tabe_sql extends AsyncTask<Void, Void, Void>{

@Override
protected Void doInBackground(Void... params) {



database db=new database();
db.query2(name,pass);


return null;


}


مشکلی که دارم بعد اینکه دستورات اجرا شد میخوام پیغام نمایش بدم اما خطا doInBackground , thered میده
چطور میشه این مشکل حل کرد
ممنون

parvizwpf
سه شنبه 16 اردیبهشت 1393, 15:06 عصر
اول بگید منظورتون sql یا sqlite? شما برای کار با دیتابیس لوکال نیازی به استفاده از این کلاس ندارید. مگر اینکه دیتابیس روی وب باشه. برای نمایش هم همین کلاس متدی داره بنام onPostExecute که باید override کنید و میتونید عملیات بعد از ترد رو انجام بدید طبق خروجی مشخص. من اون خطا رو هم نفهمیدم چیه، اگه میشه ارور رو اینحا بزارید.

sara_traveler
چهارشنبه 17 اردیبهشت 1393, 07:52 صبح
نه من باید اطلاعات در اسکیول ذخیره کنم

ببینید من دارم رنامه برا ک شرکت بازرگانی بزرگ میویسم که کلی ویزیتور داره
ویزیتور در سطح شهر درخواست هاشونو از طریق نت باید بفرساتن و اطلاعات روی اسکیول سرور ذخیره بشه از این طرف اینها جنس بفرستن
پس باید اطلاعات در اسکیول ذخیره بشه

و من زمانی که دستورات اسکیول در این تابع گذاشتم جواب میده در غیر اینصورت جواب نمیده
ا

الان من بخوم تو همین تابه یک پیغام نمایش بدم چطوری باید بنویسم فرض کنید اسکیول هم وچود نداره

ممنون

poorman
چهارشنبه 17 اردیبهشت 1393, 18:12 عصر
ببینید کلاس AsyncTask برای انجام دادن عملیات در پشت برنامه است، یعنی هر عملیات طولانی که توی تابع doInBackground این کلاس انجام بشه باعث قفل شدن صفحه شما نمیشه

این کلاس سه تا تابع اصلی داره

اولی onPreExecute که هر کاری میخواین قبل از انجام عمل اصلی انجام بشه اینجا اجرا میشه، مثل نمایش یک پیام یا شروع انیمیشن

تابع دوم doInBackground هست که عملیات اصلی رو انجام میده، مثل کاری که شما میخواین بکنین، خوندن اطلاعات از سرور

تابع سوم onPostExecute هست که بعد از اتمام تابع قبل انجام میشه و اینجاست که شما باید پیام نمایش داده شده رو ببندید

توجه : توی تابع doInBackground نمیشه کارهایی که مرتبط با اینترفیس برنامه هست انجام داد، مثل نمایش پیام یا عکس و ...

private class AsyncOpenDatabse extends AsyncTask<Void, Void, Void>{
ProgressDialog pdLoading = new ProgressDialog(MainMenu.this);

@Override
protected void onPreExecute() {
super.onPreExecute();


//this method will be running on UI thread
pdLoading.setMessage("\tLoading...");
pdLoading.setTitle(Farsi.Convert("لطفا چند دقیقه صبر کنید"));
pdLoading.setCancelable(false);
pdLoading.show();
}
@Override
protected Void doInBackground(Void... params) {


//this method will be running on background thread so don't update UI frome here
//do your long running http tasks here,you dont want to pass argument and u can access the parent class' variable url over here



return null;
}


@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);


//this method will be running on UI thread
pdLoading.dismiss();
}


}

Nevercom
چهارشنبه 17 اردیبهشت 1393, 18:42 عصر
پیشنهاد می کنم فریم وورک Bolts رو بررسی کنید، یک فریم وورک بسیار قوی برای اجرای Asynchronous کدها هست: https://github.com/BoltsFramework/Bolts-Android

نمونه کدش رو ببینید:
saveAsync(obj).continueWith(newContinuation<ParseObject,Void>(){ public Void then(Task<ParseObject> task) throws Exception {
if (task.isCancelled()) {
// the save was cancelled.
} else if (task.isFaulted()) {
// the save failed.
Exception error = task.getError()
} else {
// the object was saved successfully.
ParseObject object = task.getResult();
}
return null;
} });