View Full Version : سوال در مورد کلاس Asynctask در جاوا
javadshaahin
دوشنبه 02 فروردین 1395, 19:00 عصر
دوستان اساتید و عزیزان درود
میخواستم بپرسم آیا کلاسی در زبان جاوا هست که همین کار Asynctask رو توی برنامه های تحت ویندوز بکنه ؟
با این کلاس تو اندروید کار کردم ولی دارم یه برنامه تو ویندوز به زبان جاوا مینویسم ولی این کلاس توش کار نمیکنه ممنون میشم راهنمایی کنید
یعنی راستش نتونستم این کلاس رو اگه هم داره به برنامه import کنم ممنون میشم کمکم کنید
javadshaahin
یک شنبه 08 فروردین 1395, 10:23 صبح
دوستان اساتید و عزیزان درود
میخواستم بپرسم آیا کلاسی در زبان جاوا هست که همین کار Asynctask رو توی برنامه های تحت ویندوز بکنه ؟
با این کلاس تو اندروید کار کردم ولی دارم یه برنامه تو ویندوز به زبان جاوا مینویسم ولی این کلاس توش کار نمیکنه ممنون میشم راهنمایی کنید
یعنی راستش نتونستم این کلاس رو اگه هم داره به برنامه import کنم ممنون میشم کمکم کنید
من دیدم کسی جواب نمیده خوب به این نتیجه رسیدم که کسی بلد نیست و خودم راه حلش رو پیدا کردم
برای اجرای کد های سنگین در پشت برنامه به طوری که به روند برنامه اسیبی نرسونه از لحاظ کند شدن و قفل برنامه تا پایان اجرای کد
میتونید از این روش استفاده کنید
private class aTask extends SwingWorker<Void, String>
{
@Override
protected Void doInBackground() throws InterruptedException
{
کد های مربوط به کاری که مد نظرتون هست
return مقدار;
}
}
این روش معمولا برای بک اپ گرفتن از دیتابیس های سنگین و اعمال این طوری که زمان زیادی برای اجراشون طول میکشه استفاده میشه
اگر از این روش اسفاده نکنید برنامه تو همون زمانی که نیاز داره تا کدهاش تمام و کمال اجرا بشه فقط میشه و اجازه ی انجام کارهای دیگه رو بهتون نمیده
برای جلوگیری از این کار یک تابع به این روش تعریف کنید و درونش کد های مربوط به کار خودتون رو بنویسید و هر موقعی خواستید و بهش نیاز پیدا کردید فقط اسم تابع رو فراخوانی کنید
کد هایی که در این تابع میزارید میره پشت برنامه انجام میشه و میاد جواب رو برمیگردونه بدون اینکه شما احساس کنید و یا منتظر جواب بمونید
شما این تابع رو فراخوانی کنید و کارهای دیگه تو برنامه رو انجام بدید و وقتی که کار این تابع تمام شد خودش جواب رو در جایی که خودتون تایین کردید ذخیره میکنه
امیدوارم واضع گفته باشم و منظورم رو رسونده باشم
اگر کسی هم سوالی داشت مطرح کنه
این عمل مربوط به IDE Netbeans میشه که با مقداری تغییر میتونید تو سی شارپ هم ازش استفاده کنید
البته خود سی شارپ این تابع رو توی Tollbox خودش داره فقط دابل کلیک کنید و کدهای خودتون رو توی خاصیتش بنویسید
ahmad.mo74
دوشنبه 09 فروردین 1395, 06:02 صبح
سلام.
این کد کلاس AsyncTask اندرویده :
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java
با یه کم تغییر میتونی تو پروژه غیر اندرویدی هم ازش استفاده کنی.
این (http://barnamenevis.org/showthread.php?513320-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B1%D8%AF%D8%A7%D9%86%D 8%AF%D9%86-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-null-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%86%D9%86%D8%AF-%D9%86%D8%AE%DB%8C&p=2284327&viewfull=1#post2284327) و این (http://barnamenevis.org/showthread.php?513320-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B1%D8%AF%D8%A7%D9%86%D 8%AF%D9%86-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-null-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%86%D9%86%D8%AF-%D9%86%D8%AE%DB%8C&p=2285864&viewfull=1#post2285864) رو هم ببین.
یه مثال دیگه از کلاس CompletableFuture :
فرض کن میخوایم محتویات چنتا صفحه وب رو بخونیم و بگیم که اندازه هر کدوم چه قدره.
در حالت عادی (سریال) باید url هارو دونه دونه پردازش کنیم و اندازه شون رو بگیریم بعد بریم سراغ url بعدی.
اما با این کلاس یک سری task میدیم بهش و بعد تعیین میکنیم که بعد از اتمام اجرا چه کاری باید انجام بده.
دقیقا مثل AsyncTask اندروید به صورت async تسک هارو اجرا میکنه و هر وقت اجرای هر کدوم تموم شد اون action ای که ما براش مشخص کردیم رو انجام میده.
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.CompletableFuture;
/**
* @author ahmad
*/
public class AsyncHttpRequestTest {
public static void main(String[] args) throws IOException {
String urlsToBeProcessed[] = {
"https://www.google.com/",
"https://telegram.org/",
"http://www.stackoverflow.com/",
"http://www.barnamenevis.org/",
};
for (String url : urlsToBeProcessed) {
CompletableFuture.supplyAsync(() -> {
try {
return processContent(new URL(url));
} catch (IOException e) {
throw new Error(e);
}
}).thenAccept(bytes -> System.out.println(url + " ==> content length = " + bytes.length)).exceptionally(cause -> {
System.err.println("failed to process " + url + " due to: " + cause.getMessage());
return null;
});
}
System.out.println("HERE !!!");
System.in.read();
}
public static byte[] processContent(URL url) throws IOException {
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0");
byte buffer[] = new byte[4 * 1024];
int read;
ByteArrayOutputStream out = new ByteArrayOutputStream();
try (InputStream in = urlConnection.getInputStream()) {
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
}
return out.toByteArray();
}
}
این عمل مربوط به IDE Netbeans میشه که با مقداری تغییر میتونید تو سی شارپ هم ازش استفاده کنید
میشه بیشتر توضیح بدین؟
javadshaahin
چهارشنبه 11 فروردین 1395, 14:48 عصر
سلام.
این کد کلاس AsyncTask اندرویده :
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java
با یه کم تغییر میتونی تو پروژه غیر اندرویدی هم ازش استفاده کنی.
این (http://barnamenevis.org/showthread.php?513320-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B1%D8%AF%D8%A7%D9%86%D 8%AF%D9%86-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-null-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%86%D9%86%D8%AF-%D9%86%D8%AE%DB%8C&p=2284327&viewfull=1#post2284327) و این (http://barnamenevis.org/showthread.php?513320-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B1%D8%AF%D8%A7%D9%86%D 8%AF%D9%86-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-null-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%86%D9%86%D8%AF-%D9%86%D8%AE%DB%8C&p=2285864&viewfull=1#post2285864) رو هم ببین.
یه مثال دیگه از کلاس CompletableFuture :
فرض کن میخوایم محتویات چنتا صفحه وب رو بخونیم و بگیم که اندازه هر کدوم چه قدره.
در حالت عادی (سریال) باید url هارو دونه دونه پردازش کنیم و اندازه شون رو بگیریم بعد بریم سراغ url بعدی.
اما با این کلاس یک سری task میدیم بهش و بعد تعیین میکنیم که بعد از اتمام اجرا چه کاری باید انجام بده.
دقیقا مثل AsyncTask اندروید به صورت async تسک هارو اجرا میکنه و هر وقت اجرای هر کدوم تموم شد اون action ای که ما براش مشخص کردیم رو انجام میده.
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.CompletableFuture;
/**
* @author ahmad
*/
public class AsyncHttpRequestTest {
public static void main(String[] args) throws IOException {
String urlsToBeProcessed[] = {
"https://www.google.com/",
"https://telegram.org/",
"http://www.stackoverflow.com/",
"http://www.barnamenevis.org/",
};
for (String url : urlsToBeProcessed) {
CompletableFuture.supplyAsync(() -> {
try {
return processContent(new URL(url));
} catch (IOException e) {
throw new Error(e);
}
}).thenAccept(bytes -> System.out.println(url + " ==> content length = " + bytes.length)).exceptionally(cause -> {
System.err.println("failed to process " + url + " due to: " + cause.getMessage());
return null;
});
}
System.out.println("HERE !!!");
System.in.read();
}
public static byte[] processContent(URL url) throws IOException {
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0");
byte buffer[] = new byte[4 * 1024];
int read;
ByteArrayOutputStream out = new ByteArrayOutputStream();
try (InputStream in = urlConnection.getInputStream()) {
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
}
return out.toByteArray();
}
}
میشه بیشتر توضیح بدین؟
منظورم اینه که من تو netbeans این رو اجرا گرفتم و مشکلم حل شد
من خودم جواب دادم به سوال خودم دوست عزیز ولی ممنون باز
امیدوارم ما بقی دوستان استفاده کنن
راهی رو که شما معرفی کردید یکم پیچیده نیست از نظر شما برای تازه کارا ؟
در کل سپاس
vahid-p
چهارشنبه 01 اردیبهشت 1395, 11:13 صبح
روشی که شما گفتید چه تفاوتی با اینکه بیاییم از روش Message Passing بین دو Thread استفاده کنیم داره؟
مثلا:
// UI Thread
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
System.out.println("Complete");
}
}
};
Thread t = new Thread() {
@Override
public void run() {
// یه کار سنگین و وقت گیر
//Show message
Bundle b = new Bundle();
Message msg = Message.obtain();
b.putCharSequence("response", responseMsg);
msg.setData(b);
handler.sendMessage(msg);
}
};
t.start();
این کد رو برای اندروید استفاده میکنم وقتی یه کار وقت گیر دارم و اندروید اجازه نمیده Thread مربوط به UI رو اشغال کنی.
در مورد پست دوم نگفتید مقدار return شده به کجا برمیگرده؟ یه جورایی شبیه Callback Thread نیست؟!
ahmad.mo74
چهارشنبه 29 اردیبهشت 1395, 10:06 صبح
روشی که شما گفتید چه تفاوتی با اینکه بیاییم از روش Message Passing بین دو Thread استفاده کنیم داره؟
تو اصل قضیه فرقی نمیکنه.
اونجا هم یه تسکی داده میشه به thread pool و ما هم میتونیم برای اون تسک Handler یا Callback تعیین کنیم.
کلاس CompletableFuture از معماری Future/Promise استفاده میکنه که یه خورده پیچیده هست اما انعطاف پذیری و کنترل بیشتری روی تسک ها بهمون میده.
یه روش قشنگ تری که خودم همیشه استفاده میکنم معماری pipeline هست.
یعنی تسک ها یا فرآیند ها داخل pipeline قرار بگیرن و از طریق یه EventBus یا DataBus با هم صحبت کنن.
مثلا :
https://github.com/ahmadmo/pipes/blob/master/src/test/java/org/util/pipes/Test.java
در مورد پست دوم نگفتید مقدار return شده به کجا برمیگرده؟ یه جورایی شبیه Callback Thread نیست؟!
کدوم پست؟ کدوم return؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.