PDA

View Full Version : ایجاد نخ های فرعی



saeed_g21
جمعه 09 اسفند 1392, 13:59 عصر
سلام دوستان خسته نباشید

من با استفاده از دستور زیر نخ فرعی میسازم می خواستم بدونم ایجاد نخ های فرعی محدودیت داره یا نه و اینکه آیا کم و زیاد بودن این نخ ها باعث بوجود آمدن مشکل در دستگاه (از نظر سرعت پردازنده) و برنامه میشه یا نه


new Thread(new Runnable() {
public void run() {
}
});

smemamian
جمعه 09 اسفند 1392, 14:05 عصر
هر نخ رو یک شی جاندار در نظر بگیر، این جاندار/ها نیاز به آب و غذا دارند، پس نخ ها هم از منابع سیستمی استفاده می کنن.
اگه مدیریتی روی این نخ ها نباشه، مسلماً منابع شما از بین میره. مثال:در نظر بگیرید شما واسه یه کار ساده از IntentServiceها
استفاده کنید. IntentServicها به ازای هر عمل یک نخ کارگر ایجاد می کنن در صورتی که شما می تونستید همون کار ساده
رو با یک AsyncTask در پس زمینه انجام بدین.

saeed_g21
جمعه 09 اسفند 1392, 14:16 عصر
چند روز پیش دوست عزیزمان r_khan تاپیک ایجاد کرده بودن با موضوع "اجرای همزمان دوکار" منم همین مشکلی که داشتن داشتم ایشان هر دیتابیس رو آپدیت میکردن ولی من هر چند دقیقه یکبار مختصات رو به سرور میفرستم که این کار باعث میشد تا زمانی که ارسال مختصات تمام نشده برنامه با مشکل مواجه بشه که شما راه حل نخ فرعی رو در اون تاپیک پیشنهاد دادین و منم استفاده کردم و مشکل برطرف شد و از اون بابت ازشما ممنونم خلاصه برای رفع اوم مشکل از نخ فرعی استفاده کردم حتی قبلش از AsyncTask استفاده کرده بودم که جوابگو نبود ولی الان مشکلم برطرف شده همینطور میخواستم چندتا دیگه هم ایجاد کنم که اول خواستم نظر شما اساتید رو بدونم پیشنهاد میکنین یا نه

haniiii
جمعه 09 اسفند 1392, 14:21 عصر
هر نخ رو یک شی جاندار در نظر بگیر، این جاندار/ها نیاز به آب و غذا دارند، پس نخ ها هم از منابع سیستمی استفاده می کنن.
اگه مدیریتی روی این نخ ها نباشه، مسلماً منابع شما از بین میره. مثال:در نظر بگیرید شما واسه یه کار ساده از IntentServiceها
استفاده کنید. IntentServicها به ازای هر عمل یک نخ کارگر ایجاد می کنن در صورتی که شما می تونستید همون کار ساده
رو با یک AsyncTask در پس زمینه انجام بدین.

من معمولا از AsyncTask استفاده میکنم ... اما وقتی میخوام از دو AsyncTask استفاده کنم با مشکل مواجه میشم .... اونطور که من فهمیدم تا زمانی که AsyncTask اول کارش تموم نشه دومی شروع نمیشه ... راه حل چیه ؟

#root#
جمعه 09 اسفند 1392, 14:35 عصر
منظور از نخ فرعی چیه دوستان؟

ویرایش : اینجا (http://barnamenevis.org/showthread.php?442613-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86-%D8%AF%D9%88%DA%A9%D8%A7%D8%B1&highlight=%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86%DB% 8C) رو پاک یادم رفته بود ، الان آقا مدیر میاد به حساب پستم میرسه :لبخند:

saeed_g21
جمعه 09 اسفند 1392, 14:43 عصر
منظور از نخ فرعی چیه دوستان؟



اینجارو (http://barnamenevis.org/showthread.php?442613-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86-%D8%AF%D9%88%DA%A9%D8%A7%D8%B1&highlight=%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86%DB% 8C)که دیدی و خواندی

smemamian
جمعه 09 اسفند 1392, 15:20 عصر
من معمولا از AsyncTask استفاده میکنم ... اما وقتی میخوام از دو AsyncTask استفاده کنم با مشکل مواجه میشم .... اونطور که من فهمیدم تا زمانی که AsyncTask اول کارش تموم نشه دومی شروع نمیشه ... راه حل چیه ؟

تا حدودی درست گفتید. به طور کلی باید از هر شیء که از اون AsyncTask می گیرید، یک بار اجرا بشه.
در 2 مثال زیر، مثال اولی اشتباهه و مثالی دومی درسته و به درستی کارمی کنه :


-

MyAsyncTask task = new MyAsyncTask();
for(int i = 0 ; i < 5 ; ++i){
task.execute((Void)null);
}

+


for(int i = 0 ; i < 5 ; ++i){
MyAsyncTask task = new MyAsyncTask();
task.execute((Void)null);
}

shahin bahari
جمعه 09 اسفند 1392, 17:16 عصر
من معمولا از AsyncTask استفاده میکنم ... اما وقتی میخوام از دو AsyncTask استفاده کنم با مشکل مواجه میشم .... اونطور که من فهمیدم تا زمانی که AsyncTask اول کارش تموم نشه دومی شروع نمیشه ... راه حل چیه ؟

دلیلش این هست که ترد ها به صورت سری وارد صف میشوند. این جوری کنترل روند برنامه ساده تر میشه اما اگه شما لازمم دارید که ترد ها به صورت موازی شروع به کار کنند باید به صورت task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECU TOR);


البته حواستون به این نکته باشه که از اندروید 3 به بعد این تغییر اجرا شده و تو نسخه های قبل فکر میکم تا 10 تسک اجازه اجرای همزمان رو داشتن. شکل مطمئن صدا زدن به صورت زیر هست:

if (Build.VERSION.SDK_INT >= 11) {
//--post GB use serial executor by default --
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECU TOR);
} else {
//--GB uses ThreadPoolExecutor by default--
task.execute();
}


http://stackoverflow.com/questions/13910508/running-parallel-asynctask

barnamenevisjavan
جمعه 02 خرداد 1393, 09:49 صبح
سلام چطور میشه از این کد نخ فرعی توی دیتابیس استفاده کرد؟میخوام وقتی عمل جستجو انجام میشه بصورت نخ فرعی باشه تا گوشی دچار مشکل نشه

#root#
جمعه 02 خرداد 1393, 10:11 صبح
یه مثال از AsyncTask :

public class LoadList extends AsyncTask<String, Void, Void> {

private Context context;
private ArrayList<Data> list;
private ListView lv;
private ProgressDialog dialog;

public LoadList(Context context) {
this.context = context;
}

public void setValuse(ListView lv) {
this.lv = lv;
}

@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITL E);
dialog.setCancelable(false);
dialog.setMessage("اندکی صبر ...");
dialog.show();
}

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

String cat = params[0];

Database database = new Database(context);
list = database.getList(cat);
database.close();


return null;
}

@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
lv.setAdapter(new Adapter(context, list));
dialog.dismiss();
}

}


استفاده :

LoadList loadList = new LoadList(view.getContext());
loadList.setValuse(myListView);
loadList.execute("cat1");


یه نفر هم لطف کنه یه نمونه از thread بزاره همراه با progressDialog :قلب:

reza_azizi2010
جمعه 02 خرداد 1393, 20:07 عصر
Thread thread = new Thread(new Runnable() {

@Override
public void run() {
//code;
}
});

abbasalim
جمعه 02 خرداد 1393, 21:22 عصر
فکر میکنم فرق اساسی ترد رانیبل با AsyncTask در اینه که ترد باید کارش تموم بشه تا برنامه ادامه کار بده ولی AsyncTask در پس زمینه انجام میشه و برنامه هم به کارش ادامه میده وقتی AsyncTask کارش تموم شد میتونه به کاربر هشدار لازم رو بده ،فکر میکنم اینجوری بیشتر بتونیم بفهمیم در چه مواقعی از کدوم باید استفاده کنیم به هرحال برای کامل فهمیدن این موضوع پیشنهاد میکنم مجموعه ویدیویی pluralsight رو تحت عنوان Android Processes and Threads ببیند که اگه تبلیغ به حساب نیاد میتونید رایگان از سایت احسانavr دانلود کنید



در مورد تعداد اجرای AsyncTask اینجور که من داخل یکی از برنامه های تست کردم در اندروید 4 تا 5 AsyncTask به صورت همزمان کار انجام میدن بعد بقیه AsyncTask در حالت wait میمونن ت AsyncTask های قبلی تموم بشن و بعد شروع به فعالیت میکنن و بازم طبق تجربه شخصی بهتره بعد از هر ایجاد کانکشن در AsyncTask اون رو بعد از اتمام کار دیسکانکت کنیم تا اندروید بهتر بفهمه کلا AsyncTask کارش تموم شده (واسه من قبلش گاهی AsyncTask کارش تموم می شد ولی از تردهای برنامم خارج نمیشد تا یکی دیگه جایگزین بشه و بقیه در حالت wait میموندن)

abbasalim
جمعه 02 خرداد 1393, 21:30 عصر
119391
برای اینکه ترد های درحال اجرای برنامتون رو ببینید میتونید بعد از اجرای برنامه مراحل مشخص شده در عکس رو داخل ddms طی کنید