View Full Version : راهنمایی در استفاده از چند نخی در اندروید
rezano
جمعه 22 آبان 1394, 23:25 عصر
با سلام
یه برنامه دارم که اطلاعات رو از بانک میگیره و توی تکست ویو نمایش میده
ولی چون حجم اطلاعات خیلی زیاده چند ثانیه طول میکشه
چطور می تونم با استفاده از چند نخی در اندروید پیاده سازیش کنم.
به طوری که توی OnCreate یه نخ رو صدا بزنم و توی اون نخ اطلاعات رو از بانک بگیرم و توی تکست ویو نماش بدم
و البته برنامه خطا نده که به تکست ویو دسترسی ندارید چون توی نخ اصلی هستش.
چند تا نمونه برنامه توی نت پیدا کردم ولی با هر کدوم به مشکل برخوردم
اگه دوستان مثالی ، راه حلی بلدن لطفا راهنماییم کنن.
Nevercom
شنبه 23 آبان 1394, 04:01 صبح
با استفاده از AsyncTask میتونید کدها رو در ترد جداگانه اجرا کنید بدون اینکه نگران ویرایش اجزای UI از ترد دیگه باشید، خود AsyncTask در لایه ی زیرینش پیام ها رو به صف ترد اصلی انتقال میده.
اگر میخواید از Thread استفاده کنید، یک شئ از نوع Handler بسازید و به به ترد پاس بدید، و پیام ها رو با استفاده از Handler رد و بدل کنید:
Handler success = new Handler() { @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
tux-world
شنبه 23 آبان 1394, 19:45 عصر
در کل این روش کار اشتباهیه. منظورم استفاده از نخ تو اکتیویتی هستش. شما باید از سرویس استفاده کنید و کارهای زمان بر رو علاوه بر گذاشتن داخل ترد باید اول به سرویس انتقال بدید و اونجا بزارید داخل ترد و میتونید توسط برودکست اطلاع رسانی کنید
msroid
شنبه 23 آبان 1394, 20:25 عصر
اینجوری میتونین عمل کنین:
new Thread(new Runnable() {
@Override
public void run() {
//do your work here
//for updating the textview you should use a handler
handler.post(new Runnable() {
@Override
public void run() {
textview.setText("");
}
});
}
}).start();
rezano
شنبه 23 آبان 1394, 23:25 عصر
سلام دوستان ممنون از پاسختون.
از این روش استفاده کردم ولی تاثیری توی سرعت باز شدن اکتیویتی نداشت. (نمی دونم چرا؟)
new Thread(new Runnable() {
@Override
public void run() {
//do your work here
handler.post(new Runnable() {
@Override
public void run() {
FillViewsByInformations(GetBookFromDB(_id));
}
});
}
}).start();
از روش AsyncTask خواستم استفاده کنم که با توجه به توضیحات اینجا (http://androidstd.com/asynctask-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F/)کد زیر رو نوشتم ولی توی تعریف اولیه ش مشکل دارم. دقیقا متوجه نشدم قضیه < AsyncTask <Params, Progress, Result چیه.
اگه میشه لطفا در مورد AsyncTask و نحوه تعریف اولیه ش توضیح بدید.
کدی که نوشتم ولی خطا میده:
private class GetInformationFromDBAsyncTask extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
//super.onPreExecute();
//show Loading
}
//@Override
protected void doInBackground() {
//super.doInBackground();
GetBookFromDB();
}
protected void onProgressUpdate() {
//super.onProgressUpdate();
//Do Nothing
}
protected void onPostExecute() {
//super.onPostExecute();
FillViewsByInformations();
//Hide Loading
}
}
و البته با سرویس ها هم هنوز شروع نکردم به یادگیری، گزاشتم برای بعد. اگه می دونید اصولی ترین راه استفاده از سرویسه که برم سراغ اون.
در کل یه چیزی می خوام مثل برنامه بازار اول صفحه باز میشه بعد تصاویر و توضیحات و نظرات کم کم توی صفحه لود میشن.
برای پیاده سازی چنین چیزی بهترین روش چیه؟
Nevercom
یک شنبه 24 آبان 1394, 03:19 صبح
در کل این روش کار اشتباهیه. منظورم استفاده از نخ تو اکتیویتی هستش. شما باید از سرویس استفاده کنید و کارهای زمان بر رو علاوه بر گذاشتن داخل ترد باید اول به سرویس انتقال بدید و اونجا بزارید داخل ترد و میتونید توسط برودکست اطلاع رسانی کنید
اینکه از چه روشی استفاده بشه بستگی به نیاز اپلیکیشن داره
بعنوان مثال در مورد سوال ایشون که اکتیویتی اطلاعاتی رو نمایش میده و بدون دیتا کاربردی نداره، راه درست اجرای کد در یک ترد جداگانه هست و نه سرویس
در عوض سرویس رو زمانی مورد استفاده قرار میدیم که اجرای کدها وابستگی به باز بودن اکتیویتی خاصی نداشته باشه، مثلاً دانلود یک اپ در بازار که حتی اگر از برنامه خارج بشیم، باز هم ادامه پیدا می کنه، درواقع سرویس Life cycle جداگانه از اکتیوتی درخواست دهنده داره
---------
برای اینکه از روشی که جناب msroid پیشنهاد دادن استفاده کنید، باید کدتون به این شکل تغییر پیدا کنه:
new Thread(new Runnable() {
@Override
public void run() {
//do your work here
List<Object> list = GetBookFromDB(_id);
handler.post(new Runnable() {
@Override
public void run() {
FillViewsByInformations(list);
}
});
}
}
).start();
مسلماً نوع متغیر list باید بر طبق خروجی تابع انتخاب بشه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.