کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

اتصال به یک صفحه اینترنتی در اندروید با Thread Handler

اتصال به اینترنت در اندروید با Thread Handler
شرح مختصر پروژه

در این پروژه ما قصد داریم اهداف زیر را پیاده سازی نماییم: وصل شدن به یک صفحه اینترنتی خواندن یک پیغام از صفحه مذکور و نمایش آن به کاربر

توضیحات پروژه

با عرض سلام و خسته نباشید به شما دانشجویان محترم آموزشگاه تحلیلگر داده ها. در این مقاله قصد داریم تا نحوه کار کردن با Thread Handler را برای شما توضیح دهیم.

دوره آموزش اندروید

دوره آموزش برنامه نویسی اندروید

 

اهداف پروژه :

در این پروژه ما  قصد داریم اهداف زیر را پیاده سازی نماییم:

وصل شدن به یک صفحه اینترنتی

خواندن یک پیغام از صفحه مذکور و نمایش آن به کاربر

 

برای شروع کار ابتدا می بایست یک پروژه جدید در محیط Eclipse ایجاد نماییم. برای این منظور از منوی File زیر منوی New و سپس زیر منوی Android Application Project را انتخاب می نماییم. (شکل 1)

 

image

 

شکل 1

همچنین برای ساده تر شدن و بالا بردن سرعت کار می توانید از منوی ابزار ها، منوی New و سپس Android Aplication Project را انتخاب نمایید.(شکل 2)

image

 

شکل 2

با انجام هر دو روش پنجره جدیدی با عنوان New Android Application باز می گردد. (شکل 3)

 

image

 

شکل 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)

 

image

 

شکل 4

در مرحله بعدی اگر گزینه Create custom lunche icon را انتخاب نمایید، برنامه Eclipse به شما اجازه میدهد تا برای برنامه خود یک عکس جهت ساختن icon انتخاب و یا با استفاده از ابزار های خود برنامه Eclipse، icon مورد نظر خود را ترسیم نمایید. توجه داشته باشید که در صورت عدم انتخاب این گزینه، صفحه مربوطه برای شما باز نخواهد شد.

همچنین اگر گزینه Create Activity را انتخاب نمایید، برنامه Eclipse به شما اجازه میدهد که نام و نوع activity برنامه تان را انتخاب نمایید.

 

این دو گزینه را انتخاب می نماییم و سایر گزینه ها را به حالت پیش فرض خود می گذاریم. حال مجددا بروی دکمه Next کلیک می نماییم تا به مرحله بعدی ایجاد پروژه برویم. (شکل 5)

 

image

 

شکل 5

در مرحله بعدی می توانید برای برنامه خود یک icon انتخاب و یا رسم نمایید.

دکمه image برای انتخاب یک عکس ترجیحا با فرمت png به عنوان icon برنامه

دکمه Clipart برای انتخاب یک clipart « شکلک » به عنوان icon برنامه

دکمه Text برای ورود یک نوشته به عنوان icon برنامه مورد استفاده قرار می گیرند.

ما دکمه image را انتخاب و پس از انتخاب کردن عکس مورد نظر به عنوان icon برنامه بر روی دکمه Next کلیک می نماییم تا به مرحله بعدی ایجاد پروژه برویم. (شکل 6)

 

image

 

شکل 6

در مرحله بعدی گزینه Create Activity را انتخاب می نماییم و از لیست موجود که بیانگر انتخاب نوع Activity برنامه می باشد گزینه Blank Activity را انتخاب می نماییم. (شکل 7)

 

image

 

شکل 7

در مرحله آخر نیز باید برای activity و layout خود یک نام انتخاب نمایید. ما نام انتخاب شده پیش فرض را قبول کرده و بر روی دکمه Finish کلیک می نماییم تا پروژه مان ساخته شود. (شکل 8)

 

image

 

شکل 8

تا اینجای کار ما پروژه خود را در برنامه Eclipse ایجاد نموده ایم. حال برای ادامه کار می بایست layout برنامه خود را طراحی نماییم.

برای این منظور یک Button بر روی layout خود قرار می دهیم. (شکل 9)

 

image

 

شکل 9

همچنین مقادیر لازمه برای نمایش متن دکمه را در فایل string.xml وارد می نماییم. (شکل 10)

 

image

 

شکل 10

حال در این مرحله می بایست کد های اصلی برنامه را در کلاس MainActivity وارد نماییم.

اولین کدی که می بایست به کلاس MainActivity اضافه نماییم متد onCreate می باشد. این متد یکی از متدهای اصلی برنامه و همچنین چرخه حیات برنامه های اندرویدی می باشد و زمانی که برنامه برای اولین بار اجرا می گردد و یا دستگاه اندرویدی ما از حالت portrait به حالت landscape و یا بر عکس تغییر می کند، این متد فراخوانی می گردد.

یکی از دستورات مهمی که باید به این متد اضافه شود دستور setContentView است. وظیفه این دستور به نمایش در آوردن layout برنامه می باشد.(شکل 11)

 

 

 

imageشکل  11

مقدار activity_main نام فایل xml مربوط به layout برنامه مان می باشد.

همچنین دستور savedInstanceState حالت جاری layout برنامه را ذخیره می نماید. به این معنا که، فرض نمایید بر روی layout خود یک ابزار EditText قرار داده اید و مقدار نام خودتان را درون آن وارد کرده اید. زمانی که حالت دستگاه اندرویدی خودتون را به landscape و یا portrait تغییر دهید مشاهده می نمایید که مقدار نام شما هنوز در EditText وجود دارد و پاک نشده است. دلیل آن به خاطر استفاده از دستور فوق می باشد.

در مرحله بعدی می بایست کدهایی بنویسیم تا بوسیله ی آن بتوانیم به ابزار Button خود دسترسی پیدا نماییم. (شکل 12)

 

image

 

شکل 12

حال که دسترسی لازم را ایجاد نموده ایم، در مرحله بعد می بایست به صفحه اینترنتی « سرور » مورد نظر خود وصل شویم و پیغام آنرا بخوانیم و به کاربر نمایش دهیم. (شکل 13)

 

image

 

شکل 13

کدهای بالا را در ادامه کدهای وارد شده قبلی در متد onCreate قرار میدهیم.

در کد بالا، ابتدا با استفاده از خصوصیت setOnClickListener، برای دکمه خود رویداد کلیک را شبیه سازی نموده ایم. در مرحله بعد، با استفاده از کلاس Toast یک پیغام کوچک مبنی بر اینکه در حال وصل شدن به سرور هستیم را به کار نمایش می دهیم.

کلاس Toast کلاسی می باشد که برای نمایش دادن پیغام هایی « با توجه به اتفاقاتی که در طول اجرای برنامه رخ می دهد » به کاربر، مورد استفاده قرار می گیرد. این کلاس سه پارامتر ورودی دارد که مقداردهی کردن هر سه پارامتر الزامی می باشد. پارامتر اول، شئی از نوع Context و پارامتر دوم، پیغام مورد نظر جهت نمایش به کاربر و پارامتر سوم، مدت زمان به نمایش درآمدن کادر پیغام می باشد که می توان از دستور Toast.LENGTH_LONG و یا Toast.LENGTH_SHORT و یا یک عدد صحیح به میلی ثانیه باشد.

هرگاه در برنامه ها نیاز به استفاده از شئی از نوع Context داشته باشیم، می توانیم از دستورات getApplicationContext، getBaseContext و یا activityname.this استفاده نماییم.

در خط بعدی با استفاده از کلاس Thread یک نخ جدید ایجاد می نماییم و دستورات مربوطه را در آن وارد می نماییم. زمانی که یک Thread اجرا می گردد، تابعی با نام run بصورت خودکار صدا زده می شود. بنابراین این متد را بازنویسی « override » می نماییم و دستورات وصل شدن به سرور را در این تابع قرار می دهیم.

قبل از تابع run، متغیر و کلاسی که به آنها احتیاج داریم را تعریف می نماییم. متغیر URL آدرس اینترنتی صفحه مورد نظر ما و  شی 

Client که از کلاس HttpClient ساخته شده است و برای عملیات وصل شدن به سرور مورد استفاده قرار می گیرد، می باشند.

در تابع run نیز کدهای لازم برای وصل شدن به سرور و خواندن پیغام مورد نظر را وارد نموده ایم. این کدها را در بلاک try / catch قرار داده ایم تا اگر زمانی در حین انجام عملیات با خطایی رو به رو شدیم، برنامه force close نشود. در بلاک try یک متغیر به نام setServerString از نوع String  تعریف نموده ایم تا پیغام دریافت شده را در آن ذخیره نماییم. در خط بعدی با استفاده از کلاس HttpGet شئی به نام httpget ساخته ایم. این کلاس پارامتر یک پارامتر دریافت می نماید که از نوع String بوده و همان آدرس URL مورد نظر می باشد.

هرگاه بخواهیم به یک سرور وصل شویم، می بایست نوع وصل شدن به سرور را نیز مشخص نماییم که عبارتند از: Get و Post.

برای استفاده از نوع Get می بایست از کلاس HttpGet و برای استفاده از نوع Post می بایست از کلاس HttpPost استفاده نماییم.

سپس با استفاده متد execute شی Client به سرور وصل شده و پیغام مورد نظر را می خوانیم و در متغیر SetServerString ذخیره می نماییم. در آخر نیز با استفاده از تابع threadMsg پیغام دریافت شده را به کاربر نمایش می دهیم.

اگر در زمان اجرای کدهای بلاک try خطایی رخ دهد، دستور بلاک catch اجرا می گردد. در این بلاک با استفاده کلاس Log، خطای تولید شده را به برنامه نویس نمایش می دهیم.

کلاس Log برای درج پیغام هایی در پنجره LogCat برای دیباگ نمودن پروژه های اندرویدی مورد استفاده قرار می گیرد. این کلاس دارای 6 متد مهم و کاربردی می باشد که عبارتند از : e، w، i، d، v، wtf. تمامی این متد ها دو پارامتر ورودی از نوع String دارند. پارامتر اول برای مشخص نمودن مقدار فیلد Tag و پارامتر دوم برای مشخص نمودن مقدار فیلد Text پنجره LogCat می باشد.

برای دسترسی به پنجره LogCat می بایست به منوی Window -> Show View -> Other… رفته و در پنجره باز شده، در کادر type filter text، عبارت LogCat را وارد نماییم و گزینه LogCat را انتخاب و بر روی دکمه OK کلیک نماییم.

تفاوت بین انواع Log ها:

Log.e

هنگام بروز یک خطا، این Log را به کار می بریم. منظورمان از خطا، عدم اجرا شدن دستوری مهم است. یعنی عملیاتی که مد نظرمان بوده است، اجرا نگردیده و یک خطا به وجود آمده است.

Log.w

زمانی به کار می رود که بخواهیم در مورد به وجود آمدن یک وضعیت، هشدار بدهیم. اگرچه وضعیت به وجود آمده، اختلال مهمی در روند اجرای کدها ایجاد نمی کند، ولی می بایست به صورت یک نکته مهم به برنامه نویس تذکر داده شود تا در صورت نیاز، موارد مربوط به آن را در کدنویسی های بعدی مد نظر قرار بدهد .

Log.i

برای نمایش اطلاعات مفیدی در زمینه اجرای بخش های مختلف برنامه اندروید به کار گرفته می شود. مثلا اگر کد شما در کل شامل 5 مرحله باشد، می توانید در انتهای اجرای هر مرحله، با Log.i، پیامی مبنی بر اجرای موفقیت آمیز هر مرحله، در LogCat نمایش بدهید.

Log.d

برای خطایابی برنامه اندروید به کار گرفته می شود. « اگر زمانی با خطا روبرو شویم، با پیام های نوشته شده توسط Log.d می توانیم علت ایجاد خطا را پیدا نماییم »

Log.v

برای نمایش تمامی نکات کوچک و بزرگ از اجرای برنامه اندروید، در قسمت LogCat ، به کار گرفته می شود.

Log.wtf

مشابه Log.e می باشد، اما برای مواردی به کار گرفته می شود که یک خطای خیلی مهم رخ داده باشد که با وقوع آن خطا، باید کل روند اجرای برنامه اندروید متوقف گردد.

 

تابع threadMsg، تابعی می باشد که خود اقدام به نوشتن آن کرده ایم که در ادامه کدهای آنرا توضیح خواهیم داد. (شکل 14)

 

image

 

شکل 14

کدهای بالا را در ادامه کدهای قبلی و بعد از کلاس Thread تعریف شده وارد می نماییم.

برای این تابع یک آرگومان ورودی تعریف نموده ایم که متن خوانده شده از سرور « مقدار متغیر SetServerString » می باشد.

در اولین خط از این تابع، با استفاده از دستور شرطی if چک نموده ایم که مقدار پارامتر ورودی تابع null و یا خالی نباشد. در داخل بدنه دستور if، ابتدا شئی  به نام b و از کلاس Bundele ساخته ایم.

از این کلاس برای پاس دادن مقادیر مختلف بین اکتیویتی ها، کلاس ها و یا توابع استفاده می گردد.

در خط بعدی یک شی با نام msgObj از کلاس Message ساخته ایم.

بعد از ساختن شی های مورد نیاز، می بایست پیغام خوانده شده از سرور را به کلاس handler ارسال نماییم تا بتوانیم با استفاده از این کلاس پیغام خوانده شده را به کاربر نمایش دهیم. برای این منظور، با استفاده از متد putString شی b، مقدار پارامتر ورودی تابع را که همان پیغام خوانده شده از سرور می باشد، در شی b و با نام کلید message ذخیره می نماییم.

متد putString دو پارامتر دریافت می نماید. پارامتر اول یک نام از نوع String و جهت مشخص نمودن نام کلید و پارامتر دوم نیز یک متغیر از نوع String و جهت مقداردهی کردن مقدار کلید مشخص شده.

به دلیل آنکه مقداری که می خواهیم در شی b ذخیره نماییم از نوع String می باشد از متد putString استفاده می نماییم.

در خط بعدی با استفاده از متد setData شی msgObj، پیغام ذخیره شده در شی b را که می خواهیم جهت نمایش دادن به کاربر، به کلاس handler ارسال نماییم، مشخص نموده ایم.

متد setData یک پارامتر دریافت می نماید که می بایست از نوع کلاس Bundle باشد.

در خط آخر نیز با استفاده از متد SendMassage شی handler، پیغام ذخیره شده در شی b را به کلاس Handler ارسال می نماییم.

در ادامه نیز کدهای کلاس Handler را وارد می نماییم. (شکل 15)

 

image

 

شکل 15

کدهای بالا را در ادامه کدهای قبلی و بعد از تابع  threadMsg وارد می نماییم.

قبل از توضیح کدهای بالا، ابتدا شرح مختصری در رابطه با وظیفه کلاس Handler می دهیم. زمانی که یک نخ ایجاد می نماییم تا اعمالی که برای آن تعریف می نماییم را برایمان انجام دهید، به UI برنامه هیچگونه دسترسی ندارد. حال اگر در اعمال تعریف شده نیاز باشد که مقادیری را به UI ارسال نماییم « مانند برنامه ای که در حال نوشتن آن هستیم »، می بایست از یکی از دو کلاس Handler و یا AsyncTask استفاده نماییم. کلاس Handler، یک کلاس تعریف شده در جاوا می باشد و از آنجایی که ما از برنامه نویسی جاوا برای تولید برنامه های اندروید استفاده می نماییم، به این کلاس نیز دسترسی داشته و می توانیم از آن استفاده نماییم. کلاس AsyncTask نیز کلاسی مختص به اندروید می باشد و توسط برنامه نویسان سیستم عامل اندروید ایجاد شده است و کاربردی شبیه به کلاس Handler دارد.

کلاس Handler یک تابع از پیش تعریف شده به نام handleMessage دارد. با استفاده از این تابع، اطلاعات تولید شده در Thread که می خواهیم در UI نمایش داده شوند را به UI ارسال می نماییم.

در داخل این تابع یک متغیر به نام aResponse و از نوع String تعریف نموده ایم و آنرا با مقدار کلید message مقداردهی نموده ایم.

با استفاده متد getData شی msg، به شی msgObj ساخته شده در تابع threadMsg دسترسی پیدا می نماییم و با استفاده از متد getString می توانیم مقدار کلیدی که در تابع threadMsg ساخته و مقداردهی نمودیم را بخوانیم.

به دلیل آنکه مقداری که می خواهیم بخوانیم از نوع Strnig می باشد، می بایست از متد getString استفاده نماییم.

متد getString یک پارامتر دریافت می نماید که از نوع Strnig می باشد و دقیقا نام کلیدی می باشد که در تابع threadMsg مورد استفاده قرار داده ایم.

در خط بعدی با استفاده از دستور شرطی if چک نموده ایم که مقدار متغیر aResponse برابر با null می باشد یا خیر؟ اگر null نباشد، توسط کلاس Toast مقدار آنرا که همان پیغام دریافت شده از سرور می باشد را به کاربر نمایش می دهیم و اگر null باشد پیغامی مبنی بر اینکه هیچ پیغامی از سرور خوانده نشده است را توسط کلاس Toast به کاربر نمایش می دهیم.

در انتها با استفاده از متد start شی background، thread ساخته شده را اجرا می نماییم. (شکل 16)

 

image

 

شکل 16

توجه داشته باشید که چون ما در برنامه خود نیاز به اینترنت داریم، می بایست مجوز دسترسی به آن را در فایل AndroidManifest.xml اضافه نماییم. (شکل 17)

 

image

 

شکل 17

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

شاد و پیروز باشید.

1394/07/27 8302 740
رمز عبور : tahlildadeh.com یا www.tahlildade.com
نظرات شما

نظرات خود را ثبت کنید...






آموزش برنامه نویسی کاربر میهمان 1396/01/11
عالی بود

عالی بود یک هفته است دنبال چنین آموزشی بودم سپاس و درود فراوان