مشخصات پروژه
-
612
-
0.0
-
8225
-
0
-
0
وصل شدن به یک صفحه اینترنتی در اندروید
اهداف پروژه : در این پروژه ما قصد داریم اهداف زیر را پیاده سازی نماییم: وصل شدن به یک صفحه اینترنتی خواندن یک پیغام از صفحه مذکور و نمایش آن به کاربر
دوره آموزش اندروید
دوره آموزش برنامه نویسی اندروید
با عرض سلام و خسته نباشید به شما دانشجویان محترم آموزشگاه تحلیلگر داده ها. در این مقاله قصد داریم تا نحوه کار کردن با AsyncroTask را برای شما توضیح دهیم.
اهداف پروژه :
در این پروژه ما قصد داریم اهداف زیر را پیاده سازی نماییم:
وصل شدن به یک صفحه اینترنتی
خواندن یک پیغام از صفحه مذکور و نمایش آن به کاربر
برای شروع کار ابتدا می بایست یک پروژه جدید در محیط Eclipse ایجاد نماییم. برای این منظور از منوی File زیر منوی New و سپس زیر منوی Android Application Project را انتخاب می نماییم. (شکل 1)
شکل 1
همچنین برای ساده تر شدن و بالا بردن سرعت کار می توانید از منوی ابزار ها، منوی New و سپس Android Aplication Project را انتخاب نمایید.(شکل 2)
شکل 2
با انجام هر دو روش پنجره جدیدی با عنوان New Android Application باز می گردد. (شکل 3)
شکل 3
در این پنجره قسمت هایی وجود دارد که در زیر به توضیح آنها می پردازیم :
Aplication Name : در این فیلد می بایست نام برنامه خود را وارد نمایید. توجه داشته باشید که هر مقداری را که در این فیلد وارد نمایید، برنامه با این نام در لیست برنامه های نصب شده قرار خواهد گرفت.
در این فیلد می توانید یک رشته فارسی نیز وارد نمایید.
Project Name : در این فیلد می بایست نام کلی پروژه خود را وارد نمایید و بهتر است که یک رشته با معنا و مرطبت با برنامه خود وارد نمایید.
زمانی که مقدار فیلد Aplication Name را وارد می نمایید، فیلد Project Name نیز بصورت خودکار همان نام را وارد می نماید. توجه داشته باشد که اگر فیلد Aplication Name را با یک رشته فارسی مقداردهی نمودید، برای جلوگیری از خطاها می بایست رشته فارسی تولید شده در فیلد Project Name را با یک رشته معادل انگلیسی جایگزین نمایید.
Package Name : در این فیلد می بایست پکیج پروژه خود را تعیین نمایید که بهتر است آدرس وب سایت خود را بدون درج http و www و بصورت از آخر به اول و به همراه نام وارد شده در فیلد Project Name وارد نمایید. این نوع مقداردهی به برنامه های مارکت نظیر بازار و Google Paly این امکان را میدهد تا زمانی که نسخه جدیدی از برنامه شما ساخته و آماده منتشر گردید باخبر شده و نسخه جدید برنامه تان را جایگزین نسخه قبلی نماید.
Minimum Required SDK : در این لیست انواع API های « نسخه های سیستم عامل اندروید » منتشر شده توسط گوگل وجود دارد. با انتخاب هر کدام از آنها مشخص می نمایید که برنامه تان به چه حداقل نسخه ای از سیستم عامل اندروید نیاز دارد. برای مثال اگر گزینه API 14 را انتخاب نمایید، برنامه تان در سیستم عامل اندروید پایین تر از اندروید 4 یا همان IceCream Sandwich، نصب و اجرا نمی گردد.
اگر از امکانات خاص نسخه های جدیدتر سیستم عامل اندروید استفاده نمی نمایید پیشنهاد می گردد که API 8 را انتخاب نمایید. چرا که با انتخاب این نسخه از سیستم عامل اندروید مطمئن خواهید بود که برنامه شما در تمامی گوشی ها و تبلت ها اجرا خواهد شد.
Target SDK : در این لیست انواع API های « نسخه های سیستم عامل اندروید » منتشر شده توسط گوگل وجود دارد. با انتخاب هر کدام از آنها مشخص می نمایید که بالاترین نسخه اندرویدی که برنامه شما می تواند در آن نصب و اجرا گردد کدام نسخه است. بدیهی ست که هرچه سطح API انتخاب شده بالاتر باشد، گوشی ها و تبلت های جدید نیز می توانند از برنامه شما استفاده نمایند.
Compile With : در این لیست انواع API های « نسخه های سیستم عامل اندروید » منتشر شده توسط گوگل وجود دارد. با انتخاب هر کدام از آنها مشخص می نمایید که برنامه Eclipse از کدام نسخه از سیستم عامل اندروید برای نوشتن کلاس های
برنامه و همچنین کامپایل و تست نمودن آن استفاده نماید.
Theme : در این لیست می توانید یک Theme برای برنامه خود انتخاب نمایید.
توجه داشته باشید زمانی که مقدار Compile With را کمتر از API 14 انتخاب نمایید، از این قسمت نمی توانید استفاده نمایید و می بایست از لیست موجود گزینه None رو انتخاب نمایید.
پس از مقداردهی نمودن فیلد های ذکر شده بر روی دکمه Next کلیک می نماییم تا به مرحله بعدی ایجاد پروژه برویم. (شکل 4)
شکل 4
در مرحله بعدی اگر گزینه Create custom lunche icon را انتخاب نمایید، برنامه Eclipse به شما اجازه میدهد تا برای برنامه خود یک عکس جهت ساختن icon انتخاب و یا با استفاده از ابزار های خود برنامه Eclipse، icon مورد نظر خود را ترسیم نمایید. توجه داشته باشید که در صورت عدم انتخاب این گزینه، صفحه مربوطه برای شما باز نخواهد شد.
همچنین اگر گزینه Create Activity را انتخاب نمایید، برنامه Eclipse به شما اجازه میدهد که نام و نوع activity برنامه تان را انتخاب نمایید.
این دو گزینه را انتخاب می نماییم و سایر گزینه ها را به حالت پیش فرض خود می گذاریم. حال مجددا بروی دکمه Next کلیک می نماییم تا به مرحله بعدی ایجاد پروژه برویم. (شکل 5)
شکل 5
در مرحله بعدی می توانید برای برنامه خود یک icon انتخاب و یا رسم نمایید.
دکمه image برای انتخاب یک عکس ترجیحا با فرمت png به عنوان icon برنامه
دکمه Clipart برای انتخاب یک clipart « شکلک » به عنوان icon برنامه
دکمه Text برای ورود یک نوشته به عنوان icon برنامه
مورد استفاده قرار می گیرند.
ما دکمه image را انتخاب و پس از انتخاب کردن عکس مورد نظر به عنوان icon برنامه بر روی دکمه Next کلیک می نماییم تا به مرحله بعدی ایجاد پروژه برویم. (شکل 6)
شکل 6
در مرحله بعدی گزینه Create Activity را انتخاب می نماییم و از لیست موجود که بیانگر انتخاب نوع Activity برنامه می باشد گزینه Blank Activity را انتخاب می نماییم. (شکل 7)
شکل 7
در مرحله آخر نیز باید برای activity و layout خود یک نام انتخاب نمایید. ما نام انتخاب شده پیش فرض را قبول کرده و بر روی دکمه Finish کلیک می نماییم تا پروژه مان ساخته شود. (شکل 8)
شکل 8
تا اینجای کار ما پروژه خود را در برنامه Eclipse ایجاد نموده ایم. حال برای ادامه کار می بایست layout برنامه خود را طراحی نماییم.
برای این منظور یک Button بر روی layout خود قرار می دهیم. (شکل 9)
شکل 9
همچنین مقادیر لازمه برای نمایش متن Button و TextView ها را در فایل string.xml وارد می نماییم. (شکل 10)
شکل 10
حال در این مرحله می بایست کد های اصلی برنامه را در کلاس MainActivity وارد نماییم.
اولین کدی که می بایست به کلاس MainActivity اضافه نماییم متد onCreate می باشد. این متد یکی از متدهای اصلی برنامه و همچنین چرخه حیات برنامه های اندرویدی می باشد و زمانی که برنامه برای اولین بار اجرا می گردد و یا دستگاه اندرویدی ما از حالت portrait به حالت landscape و یا بر عکس تغییر می کند، این متد فراخوانی می گردد.
یکی از دستورات مهمی که باید به این متد اضافه شود دستور setContentView است. وظیفه این دستور به نمایش در آوردن layout برنامه می باشد.(شکل 11)
شکل 11
مقدار activity_main نام فایل xml مربوط به layout برنامه مان می باشد.
همچنین دستور savedInstanceState حالت جاری layout برنامه را ذخیره می نماید. به این معنا که، فرض نمایید بر روی layout خود یک ابزار EditText قرار داده اید و مقدار نام خودتان را درون آن وارد کرده اید. زمانی که حالت دستگاه اندرویدی خودتون را به landscape و یا portrait تغییر دهید مشاهده می نمایید که مقدار نام شما هنوز در EditText وجود دارد و پاک نشده است. دلیل آن به خاطر استفاده از دستور فوق می باشد.
در مرحله بعدی می بایست کدهایی بنویسیم تا بوسیله ی آن بتوانیم به ابزار Button خود دسترسی پیدا نماییم. (شکل 12)
شکل 12
حال که دسترسی لازم را ایجاد نموده ایم، در مرحله بعد می بایست به صفحه اینترنتی « سرور » مورد نظر خود وصل شویم و پیغام آنرا بخوانیم و به کاربر نمایش دهیم. (شکل 13)
شکل 13
کدهای بالا را در ادامه کدهای وارد شده قبلی در متد onCreate قرار میدهیم.
در کد بالا، ابتدا با استفاده از خصوصیت setOnClickListener، برای دکمه خود رویداد کلیک را شبیه سازی نموده ایم. در مرحله بعد، یک متغیر با نام serverURL از نوع String تعریف نموده ایم و آنرا با یک آدرس انترنتی « سرور » مقداردهی نموده ایم. در مرحله بعد، یک شی با نام longOperation از کلاس LongOperation نیز ساخته ایم و بعد از آن با استفاده از متد execute شی longOperation به سرور تعیین شده وصل می شویم و پیغام را خوانده و به کاربر نمایش می دهیم.
متد execute یک پارامتر ورودی از نوع String « در این مثال » دریافت می نماید که آدرس سرور تعیین شده در متغیر serverURL می باشد.
کلاس LongOperation کلاسی می باشد که خود اقدام به ساخت آن نموده ایم که در ادامه کدهای آنرا توضیح خواهیم داد. (شکل 14)
شکل 14
کدهای بالا را در ادامه کدهای قبلی و بعد از متد onCreate وارد می نماییم.
قبل از توضیح کدهای بالا، ابتدا شرح مختصری در رابطه با وظیفه کلاس AsyncroTasck می دهیم. زمانی که یک نخ ایجاد می نماییم
تا اعمالی که برای آن تعریف می نماییم را برایمان انجام دهید، به UI برنامه هیچگونه دسترسی ندارد. حال اگر در اعمال تعریف شده نیاز باشد که مقادیری را به UI ارسال نماییم « مانند برنامه ای که در حال نوشتن آن هستیم »، می بایست از یکی از دو کلاس Handler و یا AsyncTask استفاده نماییم. کلاس Handler، یک کلاس تعریف شده در جاوا می باشد و از آنجایی که ما از برنامه نویسی جاوا برای تولید برنامه های اندروید استفاده می نماییم، به این کلاس نیز دسترسی داشته و می توانیم از آن استفاده نماییم. کلاس AsyncTask نیز کلاسی مختص به اندروید می باشد و توسط برنامه نویسان سیستم عامل اندروید ایجاد شده است و کاربردی شبیه به کلاس Handler دارد.
چه زمانی می بایست از AsyncTask استفاده نماییم؟
هر زمانی که هر یک از اقدامات طولانی مدت که ممکن است نخ اصلی را مسدود کرده و برنامه را غیرقابل اجرا سازند، می بایست از طریق AsyncTask اجرا گردند. از این میان می توان به دانلود چندین فایل، یا ایجاد درخواست های HTTP و ... اشاره نمود.
AsyncTask می بایست به طور ایده آل برای اقدامات پس زمینه که در نهایت به مدت چندین ثانیه اجرا می گردند به کار برده شود. برای اقدامات طولانی تر، چارچوب Executor از java.until.concurrent می بایست به کار برده شود که حاوی رده یا رابط هایی نظیر Executor، ThreadPoolExecutor و FutureTask می باشند.
به منظور استفاده از AsyncTask، ما می بایست آنرا به چند زیر مجموعه تقسیم نماییم. روش زیر ساده ترین نوع اجرای AsyncTask می باشد. (شکل 15)
شکل 15
به منظور اجرای این فعالیت، ما می بایست آنرا اجرا کرده و متد execute را فراخوانی نماییم. (شکل 16)
شکل 16
روش execute به ازای AsyncTask یکبار اجرا می گردد و این بدین معناست که AsyncTask نیز همانند Thread تنها یکبار اجرا می گردد. مثالی که ذکر گردید نوع ساده ای از اجرای AsyncTask می باشد. بیایید اکنون تمام روش های مهمی که ما می توانیم در یک اجرای کامل مشاهده نماییم را بررسی نماییم. (شکل 17)
شکل 17
تمام فراخوانی ها به جز روشdoInBackground ، بر روی نخ رابط کاربری اجرا می گردند. همچنین تمام آنها « به غیر از onProgressUpdate » در یک رده اجرا می گردند که به طور همزمان با doInBacground اجرا می گردد. با استفاده از فراخوانی onProgressUpdate، کاربر می تواند از رابط کاربری مطلع گردد و در این میان اطلاعاتی نظیر مقدار اقدامات انجام شده یا نتایجی که منتظر onPostExecute هستند را ارائه می دهد.
شناخت سه نوع اصلی AsyncTask بسیار ضروری می باشد:
Params: نوع داده هایی که در حین اجرا به فعالیت ارسال می گردند. نظیر مشاجراتی که به execute ارسال شده و توسط doInBackground پذیرفته می شوند.
Progress: نوع پیشرفت داده ها که توسط نخ پس زمینه گزارش شده اند و این به معنای گزارش از doInBackground به نخ رابط کاربری در onProgressUpdate می باشد.
Result: نوع نتیجه ایجاد شده یا بازگشت داده شده توسط نخ پس زمینه doInBackground و ارسال شده به رشته رابط کاربری onPostExecute می باشد.
سه نقطه بودن برخی از نوع های داده ای به معنای این است که متغیر ساخته شده از نوع آرایه با خانه های نامشخص می باشند. تعداد خانه ها در زمان مقداری دهی نمودن متغیر مشخص می گردد.
حال در ادامه به توضیح کلاس LongOperation می پردازیم.
در داخل کلاس، ابتدا متغیرهای و شی هایی که در ادامه به آنها نیاز پیدا خواهیم کرد را ساخته و تعریف می نمایم.
شی Client برای دسترسی به پروتکل Http و وصل شدن به سرور مورد استفاده قرار خواهد گرفت.
متغیر Content پیغام خوانده شده از سرور را در خود ذخیره خواهد نمود.
متغیر Error پیغام های خطاهای ایجاد شده را در خود ذخیره خواهد نمود.
شی Dialog جهت نمایش دادن یک کادر پیغام مورد استفاده قرار خواهد گرفت.
این کلاس در هنگام ساخت، یک پارامتر ورودی دریافت می نماید که از نوع Context می باشد.
برای بدست آوردن نوع Context، می توانیم از دستورات getApplicationContext، getBaseContext و یا activityname.this استفاده نماییم.
ایجاد دسترسی به ابزار TextView جهت نمایش دادن نتیجه کار به کاربر.
اولین تابعی که بازنویسی « Override » می نماییم، تابع onPreExecute می باشد. این متد هیچگاه هیچ گونه پارامتر ورودی و یا خروجی ندارد و اولین تابعی می باشد که بعد از اجرا نمودن کلاس توسط متد execute، صدا زده می شود. این تابع وظیفه اعمال تغیرات بر روی UI، قبل از اجرا شدن دستورات اصلی در نخ را دارد.
در این تابع، با استفاده از متد setText شی message مقدار --- را به TextView خود اعمال نموده ایم و در ادامه با استفاده از متد setMessage شی Dialog، یک پیغام به کادر پیغام اختصاص داده ایم و در آخر با استفاده از متد show شی Dialog، کادر پیغام را به کاربر نمایش داده ایم.
دومین تابعی که بازنویسی « Override » می نماییم، تابع doInBackground می باشد. در زمان بازنویسی این متد می بایست یک پارامتر ورودی برای آن تعریف نماییم « حتی از نوع Void ». پارامتری ورودی این تابع، نوع تعریف شده Params در مثال کلاس My AsyncTask می باشد و همچنین خروجی این تابع نوع تعریف شده Result در مثال کلاس MyAsyncTask می باشد. این تابع بلافاصله بعد از اجرا شدن کدهای تابع onPreExecute صدا زده می شود و کدهای لازم جهت وصل شدن به سرور و خواندن پیغام، درون این تابع وارد می نماییم.
کدهای متصل شدن به سرور و خواندن پیغام را درون بلاک try / catch قرار می دهیم تا اگر زمانی در اجرای کدها خطایی ایجاد گشت، برنامه دچار force close نگردد. در داخل بلاک try، یک شی با نام httpget و از نوع کلاس HttpGet ساخته ایم که با استفاده از آن، نوع متصل شدن به سرور را مشخص نموده ایم.
هرگاه بخواهیم به یک سرور وصل شویم، می بایست نوع وصل شدن به سرور را نیز مشخص نماییم که عبارتند از: Get و Post.
برای استفاده از نوع Get می بایست از کلاس HttpGet و برای استفاده از نوع Post می بایست از کلاس HttpPost استفاده نماییم.
این شی یک پارامتر ورودی از نوع String دریافت می نماید که همان آدرس سرور می باشد. و در انتها با استفاده از متد execute شی Client به سرور وصل می شویم و پیغام را می خوانیم و آنرا درون متغیر Content ذخیره می نماییم. اگر در حین اجرای دستورات، خطایی ایجاد گردد، دستورات بلاک catch اجرا خواهند شد. در این بلاک با استفاده از متد getMessage شی e، متن خطای ایجاد شده را درون متغیر Error ذخیره می نماییم و با استفاده از دستور cancel، از تابع جاری خارج شده و نخ ایجاد شده را می بندیم.
تابع سومی که بازنویسی « Override » می نماییم، تابع onPostExecute می باشد. این متد همیشه هیچ گونه خروجی ندارد و پارامتر ورودی آن نوع تعریف شده Result در مثال کلاس MyAsyncTask می باشد. این متد، زمانی که عملیات doInBackground به اتمام رسید، اجرا می گردد. وظیفه این متد به روزرسانی UI بعد از اجرا شدن تابع doInBackground می باشد. ما در این تابع، با استفاده از متد dismiss شی Dialog، کادر پیغام باز شده را می بندیم و در ادامه با استفاده از دستور شرطی if چک نموده ایم که مقدار متغیر Error برابر با null می باشد یا خیر « خطایی ایجاد شده است یا خیر »؟ اگر خطایی رخ داده بود، مقدار متغیر Error را با استفاده از متد setText شی message، در ابزار TextView نمایش می دهیم و در غیر اینصورت پیغام خوانده شده از سرور را در ابزار TextView نمایش می دهیم.
توجه داشته باشید که چون ما در برنامه خود نیاز به اینترنت داریم، می بایست مجوز دسترسی به آن را در فایل AndroidManifest.xml اضافه نماییم. (شکل 18)
شکل 18
در اینجا کار ما به اتمام میرسد. امیدواریم نهایت استفاده از این مقاله را برده باشید.
شاد و پیروز باشید.