ورود

View Full Version : استفاده از AsyncTask در API 10 به پایین



ali-star
دوشنبه 16 دی 1392, 00:15 صبح
سلام دوستان
من از AsyncTask استفاده میکنم ولی متاسفانه از API های 10 به پایین با خطا موجه میشم البته من میدونم که AsyncTask برای آندروید 4 به بالا استفاده میشه اما مجبورم ازش استفاده کنم. کسی میدونه راه حل چیه؟

rubiks.kde
دوشنبه 16 دی 1392, 00:55 صبح
دوست عزیز کی گفته AsyncTask برای آندورید 4 به بعد هست.شما یه سر به مستندات بزنی میبینی برای کلاس AsyncTask نوشته This class requires API level 3 or higher. پس ببین مشکل ازچیه.کدت رو بزار اینجا.

ali-star
دوشنبه 16 دی 1392, 01:11 صبح
دوست عزیز کی گفته AsyncTask برای آندورید 4 به بعد هست.شما یه سر به مستندات بزنی میبینی برای کلاس AsyncTask نوشته This class requires API level 3 or higher. پس ببین مشکل ازچیه.کدت رو بزار اینجا.
شرمنده 3 به بالا.:اشتباه:
خوب من روی آندروید 4 تست کردم جواب داد ولی روی 2.3 و پایین خطا میده.

rubiks.kde
دوشنبه 16 دی 1392, 01:18 صبح
کدتون رو بزارید ببینیم

ali-star
دوشنبه 16 دی 1392, 21:51 عصر
بفرما:
final int scrollSpeed=shp.getInt("scrollSpeed", 5);
final ToggleButton toggle = (ToggleButton) findViewById(R.id.toggleButton1);
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
TimerTask scrollerSchedule = new TimerTask() {
@Override
public void run() {

handler.post(new Runnable() {

@Override
public void run() {
//اگه AcyncTask رو از کد پایین حذف کنم توی خط زیر خطا میده.
new moveScrollView().execute();
}
});
}
};
scrollTimer.schedule(scrollerSchedule, 0, scrollSpeed*10);
} else {
scrollTimer.cancel();
scrollTimer = new Timer();
}
}
});

ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView1);
scrollView.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
scrollTimer.cancel();
scrollTimer = new Timer();
toggle.setChecked(false);
return false;
}
});

و

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

protected void onProgressUpdate(Void... progress) {


}

protected Void doInBackground(Void... params) {
ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView1);
int scrollPos = (int) (scrollView.getScrollY() + 1.0);
scrollView.smoothScrollTo(0, scrollPos);
return null;
}

rubiks.kde
دوشنبه 16 دی 1392, 22:51 عصر
معلومه دوست عزیز کدت اشتباهه :

از داخل تابع doInBackground نمیتونید اشیاء ui رو دستکاری کنید.ربطی هم به ورژن نداره.

شما بهتره از handler استفاده کنی که بتونی توی ترد به ui دسترسی داشته باشی.

توی توابع کلاس AsyncTask تنها توی تابع doInBackground دسترسی به ui نیست.

ali-star
سه شنبه 17 دی 1392, 09:05 صبح
میشه کدوم ویرایش کنید... و همین جا بزارید...

rubiks.kde
سه شنبه 17 دی 1392, 10:38 صبح
میشه کدوم ویرایش کنید... و همین جا بزارید...

شما باید ویرایش کنید و اگه مشکل داشتید بچه ها کمک کنن.خودتون سعی کنید موفق میشید.

ali-star
سه شنبه 17 دی 1392, 22:01 عصر
یه سوال:
من ندونستم کجای کد رو ویرایش کنم AcyncTask یا doInBackground این کد روی آندروید 3 به بالا کار میکنه امتحان هم کردم ولی توی 2.3 به پایین کار نمیکنه و ارور میده.
دوستان میشه کمک کنن؟
دارم گیج میشم...:گیج:

rubiks.kde
سه شنبه 17 دی 1392, 23:27 عصر
توی این قسمت :

TimerTask scrollerSchedule = new TimerTask() {
@Override
public void run() {

handler.post(new Runnable() {

@Override
public void run() {
//اگه AcyncTask رو از کد پایین حذف کنم توی خط زیر خطا میده.
new moveScrollView().execute();
}
});
}
};

بجای new moveScrollView().execute(); کد داخل تابع doInBackground رو بنویس.

ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView1);
int scrollPos = (int) (scrollView.getScrollY() + 1.0);
scrollView.smoothScrollTo(0, scrollPos);

چون الانشم داری ترد در ترد کار میکنی که بی فایدس.

ali-star
سه شنبه 17 دی 1392, 23:43 عصر
یه دنیا تشکر