آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

صدازدن مجدد doinBackground در Async Task

h_uk2009  11 سال پیش  11 سال پیش
0 0

سلام

موندیم چندوقته چجور میشه توی Async Task متد DoinBackground رو دوباره صدا زد تا بشه اطلاعاتی رو دوباره بروز رسانی کرد من ازین متد استفاده میکنم ولی هنگ میکنه لازم به ذکره که کلاس JsonDownloader هم که یک کلاسی استن که با استفاده از ای سینک پیاده شده و اطلاعات رو مثل هموئن دستورات استاد ارسال میکنه و درنهایت توی لیست ویو ها رو پر میکنه .. بنده میخوام با استفاده از اون متدی که دوستمون آقا مجتبی Alu در سایت دررابطه با لیزی لود کردن اطلاعات استفاده کنم که متاسفانه زمانی که میخوام ای سینک رو صدا بزنم که مثلا وقتی به آخر لیست رسید بره و ۱۰ تا آیتم بعدی رو با ای سینک از دیتابیس وب بخونه و نشون بده که با مشکل مواجهم

لازم به ذکره که حضار در این سایت واقعا محبورم ابراز کنم که بسیار بی معرفتی میکنن و کسی حاضر نیست یکبارم که شده بیاد و این لود لیزی رو به ما یاد بده یادش بخیر زمانی در سایت MajidOnline.com فلش کار میکردیم و چپ و راست سورس کدهایی رو خودمن ودیگر بچه ها میزاشتن و بقیه استفاده میکردن ولی مثل اینکه توی این سایت همه به هم میکن برو اینو یاد بگیر !‌ یک منتیم میزارن سرمون که بلد نیسی و فلان !‌  ... ایشالا که همتون پولدار تر قبل بشین از طریق همین اندروید و دونستن لیزی لود !‌

به هرکی حتی میگیم بابا یک پولی ازمون بگیرین بهمون یاد بدین یا سورسشو بهم بدین بازم همه مث اینکه سرشون شلوغه و ماشالا وقت واسه این کارای چیپ ندارن ... امیدوارم استاد بیاد این متنو بخونه بلکه در آموزشهای بعدی سایت که معلوم نیست کی میاد بیرون این آموزشو بگنجونه که ما نخوایم به اینو اون چونه بزنیم که حتی با پولم نخوان واسمون بسازن

یکم لطفا به خودتون بیاین دوستان ممکنه ناراحت بشین ولی اصلا مهم نیست چون چیزیه که باید به گوش شما و دیکر دوستان میرسوندم ... زمانی بود فلش و برنامه نویسیش روی دور بود و من سالها کار فلش میکردم میدیدم کسایی که یک برنامه رو یک ماه روش قفل میزاشتن !‌ من میخندیدم بهشون .. واقعا فلش الان چی به سرش اومد ؟!‌  آیا ارزششو داره ...

کدهای مربوط به آداپتور برای لیزی لود

        public void fill(ArrayAdapter<StructNews> adapter, final StructNews item, final int position)
{
txtTitle.setText(item.Title);
txtTitle.setTypeface(G.face4);
txtTitle.setBackgroundColor(Color.parseColor("#e0e0e0"));
int lastItemPos = G.notes.size() - 1;
Log.i("negano", "last Item Pos : " + lastItemPos + " adapter is filling : " + position);
if (lastItemPos == position) {
// ActivityMain.CurrentLastNumber += 5;

// ActivityMain.LoadMore();
new JsonDownloader("").doInBackground((Void) null); // میخوام مثلا صدا بزنم این لامصبو !

}

کد کلاس JsonDownloader



package mirian.learnenglish2.fin;

import org.apache.http.message.BasicNameValuePair;
import android.app.ProgressDialog;
import android.os.AsyncTask;


public class JsonDownloader extends AsyncTask<Void, Void, Void> {

private String urlPath;
private String fileName;
private String downloadPath;
private ProgressDialog dialog;


public JsonDownloader(String urlPath) {
this.urlPath = urlPath;
dialog = new ProgressDialog(G.CurrentActivity);

G.adapter = new AdapterNote(G.notes);
ActivityMain.lstContent.setAdapter(G.adapter);
// ActivityMain.lstContent = (ListView) findViewById(R.id.LstContent);

}


@Override
protected void onPreExecute() {
// Run UI Code Snd Views Before Beginning Progress
// Toast.makeText(G.context, "Downloading ...", Toast.LENGTH_SHORT).show();
// G.adapter = new AdapterNote(G.notes);
// ActivityMain.lstContent.setAdapter(G.adapter);
dialog.setMessage("درحال بارگزاری");
dialog.show();
super.onPreExecute();
}


@Override
protected void onPostExecute(Void aVoid) {

super.onPostExecute(aVoid);
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
//if (G.notes.size() < 1) {
ActivityMain.LoadMore();
}
}


@Override
protected Void doInBackground(Void... voids) {
G.params.add(new BasicNameValuePair("part", "" + ActivityMain.part));
G.params.add(new BasicNameValuePair("user_id", G.cellcode));
Commands.read(G.params);
return null;
}
}


 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
Hajhosseini  11 سال پیش
+2 0

حسین جان شما نیازی نیست DoinBackground  رو دوبار اجرا کنید، در صورتی که باید دوباره دانلود انجام بشه، باید کل کلاس Downloader شما دوباره اجرا بشه.
نحوه ی انجام این کار به این صورت هست. شما یک ArrayList به طول 1000 آیتم دارید که میخواید 20 تا 20 تا اینا رو دانلود کنید.
اگر شما از activity استفاده میکنید، باید توی onCreate مقدار index که همیشه در بار اول 0 هست رو به سرور ارسال کنید.
بعد از ارسال این عدد، در سرور تعریف میکنید که از آیتم 0 تا 20 رو برای کاربر برگردونه.
زمانی که 20 آیتم اول رو گرفتید، لیست رو پر میکنید. حالا باید یک متغیر داشته باشید که تعداد آیتم های لیست رو نشون بده. بعد از اینکه اسکرول انجام شد و به حد مورد نظر رسید (چندین راه برای پیدا کردن این حد هست که اگر خواستید میتونم در یک پاسخ دیگه توضیح بدم) باید تعداد قبلی لیست (19) رو +1 کنید و به دانلودر ارسال کنید، دانلودر عدد 20 رو به سرور میفرسته و 20 تا عنصر بعدی رو میگیره. اینجا شما باید 20 عنصر جدید رو به قبلی ها اضافه کنید نه اینکه عنصرتون رو new کنید.
پیاده سازیه این کارها سادست ولی بسیار زمان بره، و اگر واقعا تمیز بخواید بنویسید بسته به تجربتون شاید 3 روز تا 3 هفته طول بکشه.
پس انتظار نداشته باشید که کسی بتونه براتون بنویسه. من خودم کارمندم و انقدر تسک های شرکت زیاده، که به زور وقت میکنم هر از گاهی بیام و اینجا سوالی جواب بدم. ممکنه شما شرایطتون فرق داشته باشه ولی لطفا شرایط دیگران رو هم درک کنید و بعد قضاوت کنید.
امیدوارم مفید بوده باشه.

0 0
اینکه میگی اضافه کنه رو میشه به صورت کد بنویسی دست درد نکنه (11 سال پیش)
پاسخ به سوال 
Hajhosseini  11 سال پیش
+1 0

شما یک ArrayList داری که میتونه یک id,text,description و ... داشته باشه.
بار اول شما میگی 10 آیتم رو بگیر و در یک حلقه for کد زیر رو مینویسی.

  for(int i=0;i<=10;i++){
            StructBook item = new StructBook();
            item.selectedText = "Test : "+i;
            items.add(item);
        }

در کد بالا که من از پروژم کپی کردم یک ArrayList به نام items دارم و یک آیتم به نام item
توی این مرحله من 10 بار به item مقدار میدم و در items اونو add میکنم.
برای پر کردن مجدد کافیه اون items رو public تعریف کرده باشید و دوباره بهش item اد کنید. مانند:

 StructBook newItems = new StructBook();
newItems.selectedText = "Test : "+i;
items.add(newItems);

میتونید یک متد یا حتی یک کلاس تعریف کنید، که کارش فقط اضافه کردن به آیتم هاتون باشه، و بعد از اینکه آیتم ها اضافه شد و setAdapter کردید، لیست ویو رو notifyDataSetChange کنید تا لیست آپدیت بشه.
البته این کد باید با توجه به پروژه شما تغییر کنه.مثلا من گفتم 10 تا آیتم اضافه کن و شما باید بگید به تعدادی که از سرور میگیره اضافه کنه و در سرور مشخص کنید که چند آیتم رو برگردونه.

پاسخ به سوال 
h_uk2009  11 سال پیش
0 0

من این بحثو که میگی دنبال کردم ده تا ده تا رو هم که میگی پیاده کردم بحث اصلی سر این اسکروله و اینکه تا به آخرین آیتم رسید باید دوباره کلاس async صدا زده بشه و یک کوعری بفرستیم سرور که ده تا بخون وردار بیار بریز توی arraylist مون و بعد notify کن من با اون ده تا خوندن مشکلی ندارم بحث سر اینکه که اسکروله بفهمه تا به آخر رسید بره ده تا دیکه برداره و برنامه قاط نزنه میشه اینو توضیح بدی منم کدهای مربوطه رو در زیر میزارم

 for (int j = CurrentItemNumber; j <10 ; j++) {
JSONObject object = jsonnews.getJSONObject(j);
StructNews note = new StructNews();
note.id = object.getInt("news_id");
note.pagenumber = object.getInt("page_number");
note.Title = object.getString("news_title");
note.isfav = object.getInt("is_fav");
note.url = object.getString("url");
G.notes.add(note);
if (G.adapter != null) {
G.adapter.notifyDataSetChanged();
}
}

با اینم میفرستم سمت سرور
@Override
protected Void doInBackground(Void... voids) {
G.params.add(new BasicNameValuePair("part", "" + ActivityMain.part));
G.params.add(new BasicNameValuePair("user_id", G.cellcode));
Commands.read(G.params);
return null;
}

اینجام کدها سرور
$connection = connectToDatabase();
$part = $_REQUEST['part'];
$start = $part * 10;
$result = mysqli_query($connection, "SELECT * FROM news WHERE page_number=$select ORDER BY news_id DESC LIMIT $start,10");



پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .