تبادل اطلاعات بین برنامه اندروید و سرور اینترنتی (اینترنت)، در برنامه نویسی اندروید

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
فهرست مطالب:

  1. دانلود تعدادی عکس از آدرس های اینترنتی (آدرس های URL) و ذخیره آنها در حافظه خارجی (External Storage) و نمایش آنها در برنامه اندروید، با قابلیت Cache کردن عکس ها به گونه ای که عکس هایی که قبلا دانلود شده اند، دوباره دانلود نشوند، در برنامه نویسی اندروید
  2. نمایش یک عکس قرار گرفته در اینترنت (یک آدرس URL)، در یک ImageView ، در برنامه نویسی اندروید
  3. روشی دیگر برای نمایش یک عکس قرار گرفته در اینترنت (یک آدرس URL)، در یک ImageView ، در برنامه نویسی اندروید
  4. دانلود یک فایل از یک آدرس اینترنتی (یک URL) و نمایش میزان پیشرفت (با ProgressDialog) ، در برنامه نوسی اندروید
  5. چک کردن متصل بودن گوشی کاربر به اینترنت، در برنامه نویسی اندروید
  6. چک کردن اتصال به اینترنت، به همراه نمایش یک پیام و دو گزینه ((تلاش مجدد)) و ((بی خیال)) هنگام عدم اتصال به اینترنت، با استفاده از AlertDialog ، در برنامه نویسی اندروید
  7. استفاده از HttpGet برای دریافت اطلاعات از یک صفحه اینترنتی (آدرس URL)، با روش GET و به صورت AsyncTask ، در برنامه نویسی اندروید
  8. استفاده از HttpPost برای دریافت اطلاعات از یک صفحه اینترنتی (آدرس URL)، با روش POST و به صورت AsyncTask ، در برنامه نویسی اندروید
  9. ارسال صحیح متن های فارسی، با روش های HttpPost و HttpGet ، در برنامه نویسی اندروید
  10. تبدیل یک رشته (string) به یک JSONObject و توضیح در مورد کلاس های json parser مورد استفاده توسط برنامه نویس های اندروید
  11. تبدیل یک JSONObject به یک رشته (String)، در برنامه نویسی اندروید
  12. بر طرف کردن مشکل وجود فضای خالی در آدرس URL ، هنگام استفاده از HttpGet ، در برنامه نویسی اندروید
  13. عدم استفاده از چارچوب HTML هنگام ساخت صفحه ای بر روی سرور، برای دریافت اطلاعات آن صفحه توسط برنامه اندروید با روش JSON
  14. نمایش صحیح متن های فارسی دریافت شده با روش JSON از سرور، در برنامه نویسی اندروید
  15. خواندن اطلاعات از یک JSONObject موجود در یک JSONObject دیگر، در برنامه نویسی اندروید
  16. شرح چارچوب برنامه های اندروید با قابلیت تعامل با سرور اینترنتی (مثل برنامه های فروشگاه های اندروید، بازی های گروهی اینترنتی و ...) و توضیحاتی در مورد جزئیات ساخت یک فروشگاه اندروید
  17. به روزرسانی (update) یک برنامه اندروید، از طریق اینترنت (سرور اینترنتی)
  18. دریافت اطلاعات متنی از سرور اینترنتی (یک URL)، با روش json و پردازش اطلاعات دریافتی با کلاس های (class) مرتبط با روش json و همچنین نمایش اطلاعات در یک ListView (به همراه تست برنامه اندروید برای متن فارسی)، در برنامه نویسی اندروید
  19. چگونگی دریافت متنهایی که شامل علامت " هستند، توسط روش json (بدون به هم ریختن ساختار json که وابسته به این علامت است)، در برنامه نویسی اندروید
  20. جلوگیری از خطای Unterminated object at character هنگام کار با متن ساختاریافته به شکل json و پردازش آن، در برنامه نویسی اندروید


منبع: kelidestan.com
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
دانلود تعدادی عکس از آدرس های اینترنتی و ذخیره آنها در حافظه خارجی ونمایش آنها در برنامه اندروید

دانلود تعدادی عکس از آدرس های اینترنتی و ذخیره آنها در حافظه خارجی ونمایش آنها در برنامه اندروید

دانلود تعدادی عکس از آدرس های اینترنتی (آدرس های URL) و ذخیره آنها در حافظه خارجی (External Storage) و نمایش آنها در برنامه اندروید، با قابلیت Cache کردن عکس ها به گونه ای که عکس هایی که قبلا دانلود شده اند، دوباره دانلود نشوند، در برنامه نویسی اندروید :


در مباحثی دیگر، چگونگی نمایش یک عکس قرار گرفته در اینترنت (یک آدرس URL) را شرح می دهیم. اما در آنها، عکس مورد نظر در حافظه خارجی (External Storage) ذخیره نمی شد و نگهداری آن به صورت موقت بود. اما در برنامه های اندرویدی که زیاد با دریافت عکس از اینترنت و نمایش آن، سر و کار دارند، اصلا به صرفه نیست که با هر بار اجرای برنامه اندروید، همه عکس ها از اینترنت دریافت شده و نمایش داده شوند، بلکه عکس هایی که دریافت می شوند را در محلی در حافظه خارجی (External Storage) ذخیره می کنند و هنگامی که قرار است یک عکس جدید دانلود شود، ابتدا چک می کنند که آیا عکس قبلا دانلود شده است یا نه، اگر قبلا دانلود شده باشد، به جای دانلود دوباره آن، تنها عکس را از حافظه خارجی (External Storage) می خوانند و نمایش می دهند. این فرآیند را عملیات Cache کردن می نامند.
دقت شود که کدهای مربوط به بخش دانلود و Cache کردن عکس ها را بنده قبلا از سایتی انگلیسی زبان دریافت کرده بودم، اما به دلیل گذشت زمانی طولانی، آدرس سایت مورد نظر را فراموش کرده ام (در غیر این صورت، لینک سایت مورد نظر را ذکر می کردم).
اکنون قصد داریم که یک پروژه اندروید بسازیم که در آن، سه ImageView تعریف می کنیم و سه عکس هم در اینترنت داریم که باید دانلود شده، در پوشه ای در حافظه خارجی (External Storage) ذخیره شوند و سپس در ImageView ها نمایش داده شوند. ذخیره سازی هم به صورت Cache کردن می باشد، یعنی برنامه اندروید ابتدا چک می کند که آیا عکس ها در پوشه مورد نظر در حافظه خارجی (External Storage)، قبلا ذخیره شده اند یا خیر.


952.jpg

953.jpg

فایل پروژه اندروید و همچنین فایل apk ساخته شده از آن را می توانید از انتهای مبحث دانلود نمایید.

سه عکس مورد نظر را در آدرس های اینترنتی (آدرس های URL) زیر قرار داده ایم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http[COLOR=#339933]:[/COLOR][COLOR=#666666][I]//www.kelidestan.com/fixed-url/Kelidestan_image_1.jpg[/I][/COLOR]
http[COLOR=#339933]:[/COLOR][COLOR=#666666][I]//www.kelidestan.com/fixed-url/Kelidestan_image_2.jpg[/I][/COLOR]
http[COLOR=#339933]:[/COLOR][COLOR=#666666][I]//www.kelidestan.com/fixed-url/Kelidestan_image_3.jpg[/I][/COLOR][/FONT]
[/FONT][/COLOR]
آدرس های فوق، مربوط به پوشه fixed-url در سایت کلیدستان می باشند و نامگذاری این پوشه هم به این علت برابر fixed-url انتخاب شده است که مدیر سایت، تحت هیچ شرایطی این پوشه و فایل های درون آن را تغییر ندهد و بنابراین، برنامه نویسان بتوانند با خیال راحت، از فایل های موجود در آن استفاده کنند.نام پروژه اندروید را برابر DownloadImageCache انتخاب کرده ایم (نام package برابر com.kelidestan.downloadimagecache انتخاب شده است. نام Activity اصلی را برابر MainActivity.java انتخاب کرده ایم و فایل xml متناظر آن را هم برابر activity_main.xml قرار داده ایم) :

956.jpg

حتما با دیدن ساختار پروژه اندروید در شکل بالا، متوجه شده اید که در این پروژه اندروید، به غیر از package اصلی با نام com.kelidestan.downloadimagecache (که Activity اصلی برنامه اندروید با نام MainActivity.java در آن قرار گرفته است)، یگ package دیگر نیز با نام com.kelidestan.imageloadercache داریم که 4 فایل در زیرمجموعه آن قرار گرفته اند :

957.jpg

در واقع، این 4 فایل، 4 کلاس (class) می باشند که عملیات مربوط به دانلود عکس، ذخیره کردن آن در حافظه خارجی (External Storage) و عملیات های مربوط به cache و همچنین نمایش عکس در یک ImageView را انجام می دهند. شاید این سوال پیش بیاید که چرا یک package جداگانه برای آنها ساخته ایم، پاسخ این است که در پروژه های اندروید، معمولا کلاس های مرتبط با هم را در package های جداگانه قرار می دهند تا در صورتی که تعداد کلاس ها (class) ها زیاد شود، آنگاه برنامه نویس گیج نشود و پروژه اندروید، دارای ساختاری منظم و غیر گیج کننده باشد.

این نوع ساختار به شما کمک می کند که مثلا اگر در یک پروژه اندروید دیگر نیاز به عملیات دانلود عکس و cache کردن آن داشتید، خیلی راحت، تنها فایل های موجود در package مورد نظر را به درون آن پروژه اندروید جدید کپی کنید.

قبل از اینکه به سراغ این فایل ها برویم، ابتدا بهتر است که اجازه های (permissions) مورد نیاز برای برنامه اندروید را در فایل AndroidManifest.xml ذکر کنیم. چون باید به اینترنت متصل شویم و همچنین باید قابلیت خواندن و نوشتن در حافظه خارجی (External Storage) را داشته باشیم، بنابراین باید اجازه های زیر به برنامه اندروید داده شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR]
[COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.WRITE_EXTERNAL_STORAGE"[/COLOR] [COLOR=#339933]/>[/COLOR]
[COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.READ_EXTERNAL_STORAGE"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
پس باید فایل AndroidManifest.xml از پروژه اندروید را باز کرده و کدهای بالا را در آن بنویسیم :

958.jpg



بنابراین کدهای فایل AndroidManifest.xml به صورت زیر خواهد بود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]manifest xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    [B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.downloadimagecache"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionCode[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionName[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]sdk
        android[COLOR=#339933]:[/COLOR]minSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"8"[/COLOR]
        android[COLOR=#339933]:[/COLOR]targetSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"18"[/COLOR] [COLOR=#339933]/>[/COLOR]
    
    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR]
    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.WRITE_EXTERNAL_STORAGE"[/COLOR] [COLOR=#339933]/>[/COLOR]
    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.READ_EXTERNAL_STORAGE"[/COLOR] [COLOR=#339933]/>[/COLOR]

    [COLOR=#339933]<[/COLOR]application
        android[COLOR=#339933]:[/COLOR]allowBackup[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR]
        android[COLOR=#339933]:[/COLOR]icon[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR]
        android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR]
        android[COLOR=#339933]:[/COLOR]theme[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@style/AppTheme"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.downloadimagecache.MainActivity"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR] [COLOR=#339933]>[/COLOR]
            [COLOR=#339933]<[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
                [COLOR=#339933]<[/COLOR]action android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.action.MAIN"[/COLOR] [COLOR=#339933]/>[/COLOR]

                [COLOR=#339933]<[/COLOR]category android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.category.LAUNCHER"[/COLOR] [COLOR=#339933]/>[/COLOR]
            [COLOR=#339933]</[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]</[/COLOR]application[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]manifest[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
بهتر است که همیشه در ابتدای ساخت پروژه اندروید، اجازه های (permissions) مورد نیاز برای آن را در فایل AndroidManifest.xml بنویسید، زیرا معمولا این موارد فراموش می شود و به همین دلیل، برنامه اندروید با force close (بسته شدن اجباری برنامه اندروید) روبرو می شود و برنامه نویس نیز به سختی دلیل آن را متوجه خواهد شد.

اکنون به سراغ 4 فایل مربوط به دانلود عکس، ذخیره کردن آن در حافظه خارجی (External Storage) و عملیات های مربوط به cache و همچنین نمایش عکس در یک ImageView می رویم :959.jpg

کدهای فایل FileCache.java به صورت زیر می باشد :
کد:
[FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.imageloadercache[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]java.io.File[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.Context[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] FileCache [COLOR=#009900]{[/COLOR]
    
    [B]private[/B] [COLOR=#003399]File[/COLOR] cacheDir[COLOR=#339933];[/COLOR]
    
    [B]public[/B] FileCache[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] context[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
        [COLOR=#666666][I]//Find the dir to save cached images[/I][/COLOR]
        [B]if[/B][COLOR=#009900]([/COLOR]android.[COLOR=#006633]os[/COLOR].[COLOR=#003399]Environment[/COLOR].[COLOR=#006633]getExternalStorageState[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]equals[/COLOR][COLOR=#009900]([/COLOR]android.[COLOR=#006633]os[/COLOR].[COLOR=#003399]Environment[/COLOR].[COLOR=#006633]MEDIA_MOUNTED[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR]
            cacheDir[COLOR=#339933]=[/COLOR][B]new[/B][COLOR=#003399]File[/COLOR][COLOR=#009900]([/COLOR]android.[COLOR=#006633]os[/COLOR].[COLOR=#003399]Environment[/COLOR].[COLOR=#006633]getExternalStorageDirectory[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR],[COLOR=#0000FF]"myFolder/.hidden_folder"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] [COLOR=#666666][I]// point to folder be hidden[/I][/COLOR]
        [B]else[/B]
            cacheDir[COLOR=#339933]=[/COLOR]context.[COLOR=#006633]getCacheDir[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [B]if[/B][COLOR=#009900]([/COLOR][COLOR=#339933]![/COLOR]cacheDir.[COLOR=#006633]exists[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR]
            cacheDir.[COLOR=#006633]mkdirs[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
    
    [B]public[/B] [COLOR=#003399]File[/COLOR] getFile[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] url[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
        [COLOR=#666666][I]//I identify images by hashcode. Not a perfect solution, good for the demo.[/I][/COLOR]
        [COLOR=#003399]String[/COLOR] filename[COLOR=#339933]=[/COLOR][COLOR=#003399]String[/COLOR].[COLOR=#006633]valueOf[/COLOR][COLOR=#009900]([/COLOR]url.[COLOR=#006633]hashCode[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#666666][I]//Another possible solution (thanks to grantland)[/I][/COLOR]
        [COLOR=#666666][I]//String filename = URLEncoder.encode(url);[/I][/COLOR]
        [COLOR=#003399]File[/COLOR] f [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]File[/COLOR][COLOR=#009900]([/COLOR]cacheDir, filename[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [B]return[/B] f[COLOR=#339933];[/COLOR]
        
    [COLOR=#009900]}[/COLOR]
    
    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] clear[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
        [COLOR=#003399]File[/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] files[COLOR=#339933]=[/COLOR]cacheDir.[COLOR=#006633]listFiles[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [B]if[/B][COLOR=#009900]([/COLOR]files[COLOR=#339933]==[/COLOR][COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR]
            [B]return[/B][COLOR=#339933];[/COLOR]
        [B]for[/B][COLOR=#009900]([/COLOR][COLOR=#003399]File[/COLOR] f[COLOR=#339933]:[/COLOR]files[COLOR=#009900])[/COLOR]
            f.[COLOR=#006633]delete[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
نکته مهم :

همان طور که می دانید، باید پوشه ای را به عنوان محل نگهداری فایل های مربوط به ذخیره کردن (cache کردن) عکس ها در حافظه خارجی (External Storage) تعیین کنیم. این مورد، با خط زیر از کدها، تعیین شده است :
کد:
[FONT=monospace]cacheDir[COLOR=#339933]=[/COLOR][B]new[/B] [COLOR=#003399]File[/COLOR][COLOR=#009900]([/COLOR]android.[COLOR=#006633]os[/COLOR].[COLOR=#003399]Environment[/COLOR].[COLOR=#006633]getExternalStorageDirectory[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR],[COLOR=#0000FF]"myFolder/.hidden_folder"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][COLOR=#666666][I]// point to folder be hidden[/I][/COLOR][/FONT]
در واقع، با کد بالا تعیین کرده ایم که در مسیر اصلی پوشه بندی گوشی (محل پوشه بندی گوشی - پوشه root)، یک پوشه با نام myFolder ساخته شود و سپس درون آن، یک پوشه با نام .hidden_folder ساخته شود که فایل های مربوط به ذخیره کردن (cache کردن) عکس ها، در آن قرار خواهد گرفت. اما اگر دقت کرده باشید، در ابتدای نام پوشه دوم، علامت نقطه (.) را به کار برده ایم. به این دلیل که در اندروید، قرارداد است که اگر در ابتدای نام یک فایل یا پوشه، علامت نقطه (.) وجود داشته باشد، آن پوشه به صورت مخفی (hidden) خواهد بود و چون ما هم دوست نداریم که کاربران، فایل های مربوط به ذخیره کردن (cache کردن) را ببینند، این پوشه را به صورت مخفی (hidden) می سازیم. به هر حال، شما آدرس مورد نظرتان را برای این مسئله تعیین کنید و یا حتی اگر دوست داشتید، می توانید پوشه را به صورت غیر مخفی بسازید.

نکته مهم :

معمولا برنامه نویسان، کدهای خود را چند بار تست می کنند، بنابراین اگر کدهای برنامه اندروید را تغییر دادید و قصد داشتید که دوباره آن را از ابتدا تست کنید، حتما پوشه myFolder (یا هر نامی که خودتان انتخاب کرده اید) را حذف کنید تا دوباره از اول، عکس ها دانلود شوند و اگر کدهای بخش دانلود مشکلی داشتند، آن مشکل را متوجه بشوید. فکر کنم با بیان این نکته، حکمت آن را هم متوجه شده باشید که اصلا چرا پوشه مخفی را در پوشه بندی اصلی گوشی اندروید نساختیم و چرا آن را در پوشه ای با نام myFolder ساختیم (چون مخفی بود، حذف کردن آن سختتر می شد و باید در تنظیمات گوشی، تعیین می کردیم که پوشه های مخفی هم نمایش داده شوند و بعد برای حذف آن اقدام می کردیم).

کدهای فایل ImageLoader.java به صورت زیر می باشد :
کد:
[FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.imageloadercache[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]java.io.File[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.FileInputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.FileNotFoundException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.FileOutputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.InputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.OutputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.HttpURLConnection[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.URL[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.Collections[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.Map[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.WeakHashMap[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.concurrent.ExecutorService[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.concurrent.Executors[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.Context[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.graphics.Bitmap[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.graphics.BitmapFactory[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.ImageView[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]com.kelidestan.downloadimagecache.R[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] ImageLoader [COLOR=#009900]{[/COLOR]
    
    MemoryCache memoryCache[COLOR=#339933]=[/COLOR][B]new[/B] MemoryCache[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    FileCache fileCache[COLOR=#339933];[/COLOR]
    [B]private[/B] Map[COLOR=#339933]<[/COLOR]ImageView, String[COLOR=#339933]>[/COLOR] imageViews[COLOR=#339933]=[/COLOR][COLOR=#003399]Collections[/COLOR].[COLOR=#006633]synchronizedMap[/COLOR][COLOR=#009900]([/COLOR][B]new[/B]WeakHashMap[COLOR=#339933]<[/COLOR]ImageView, String[COLOR=#339933]>[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    ExecutorService executorService[COLOR=#339933];[/COLOR] 
    
    [B]public[/B] ImageLoader[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] context[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
        fileCache[COLOR=#339933]=[/COLOR][B]new[/B] FileCache[COLOR=#009900]([/COLOR]context[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        executorService[COLOR=#339933]=[/COLOR]Executors.[COLOR=#006633]newFixedThreadPool[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]5[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
    
    [B]final[/B] [COLOR=#000066][B]int[/B][/COLOR] stub_id[COLOR=#339933]=[/COLOR]R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]ic_launcher[/COLOR][COLOR=#339933];[/COLOR]
    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] DisplayImage[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] url, ImageView imageView[COLOR=#009900])[/COLOR]
    [COLOR=#009900]{[/COLOR]
        imageViews.[COLOR=#006633]put[/COLOR][COLOR=#009900]([/COLOR]imageView, url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        Bitmap bitmap[COLOR=#339933]=[/COLOR]memoryCache.[COLOR=#006633]get[/COLOR][COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [B]if[/B][COLOR=#009900]([/COLOR]bitmap[COLOR=#339933]!=[/COLOR][COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR]
            imageView.[COLOR=#006633]setImageBitmap[/COLOR][COLOR=#009900]([/COLOR]bitmap[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [B]else[/B]
        [COLOR=#009900]{[/COLOR]
            queuePhoto[COLOR=#009900]([/COLOR]url, imageView[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            imageView.[COLOR=#006633]setImageResource[/COLOR][COLOR=#009900]([/COLOR]stub_id[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
    [COLOR=#009900]}[/COLOR]
        
    [B]private[/B] [COLOR=#000066][B]void[/B][/COLOR] queuePhoto[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] url, ImageView imageView[COLOR=#009900])[/COLOR]
    [COLOR=#009900]{[/COLOR]
        PhotoToLoad p[COLOR=#339933]=[/COLOR][B]new[/B] PhotoToLoad[COLOR=#009900]([/COLOR]url, imageView[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        executorService.[COLOR=#006633]submit[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] PhotosLoader[COLOR=#009900]([/COLOR]p[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
    
    [B]private[/B] Bitmap getBitmap[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] url[COLOR=#009900])[/COLOR] 
    [COLOR=#009900]{[/COLOR]
        [COLOR=#003399]File[/COLOR] f[COLOR=#339933]=[/COLOR]fileCache.[COLOR=#006633]getFile[/COLOR][COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
        [COLOR=#666666][I]//from SD cache[/I][/COLOR]
        Bitmap b [COLOR=#339933]=[/COLOR] decodeFile[COLOR=#009900]([/COLOR]f[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [B]if[/B][COLOR=#009900]([/COLOR]b[COLOR=#339933]!=[/COLOR][COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR]
            [B]return[/B] b[COLOR=#339933];[/COLOR]
        
        [COLOR=#666666][I]//from web[/I][/COLOR]
        [B]try[/B] [COLOR=#009900]{[/COLOR]
            Bitmap bitmap[COLOR=#339933]=[/COLOR][COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#003399]URL[/COLOR] imageUrl [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]URL[/COLOR][COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#003399]HttpURLConnection[/COLOR] conn [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#003399]HttpURLConnection[/COLOR][COLOR=#009900])[/COLOR]imageUrl.[COLOR=#006633]openConnection[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            conn.[COLOR=#006633]setConnectTimeout[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]30000[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            conn.[COLOR=#006633]setReadTimeout[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]30000[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            conn.[COLOR=#006633]setInstanceFollowRedirects[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#003399]InputStream[/COLOR] is[COLOR=#339933]=[/COLOR]conn.[COLOR=#006633]getInputStream[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#003399]OutputStream[/COLOR] os [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]FileOutputStream[/COLOR][COLOR=#009900]([/COLOR]f[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            Utils.[COLOR=#006633]CopyStream[/COLOR][COLOR=#009900]([/COLOR]is, os[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            os.[COLOR=#006633]close[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            bitmap [COLOR=#339933]=[/COLOR] decodeFile[COLOR=#009900]([/COLOR]f[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]return[/B] bitmap[COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Throwable[/COLOR] ex[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
           ex.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [B]if[/B][COLOR=#009900]([/COLOR]ex [B]instanceof[/B] [COLOR=#003399]OutOfMemoryError[/COLOR][COLOR=#009900])[/COLOR]
               memoryCache.[COLOR=#006633]clear[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [B]return[/B] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [COLOR=#666666][I]//decodes image and scales it to reduce memory consumption[/I][/COLOR]
    [B]private[/B] Bitmap decodeFile[COLOR=#009900]([/COLOR][COLOR=#003399]File[/COLOR] f[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
        [B]try[/B] [COLOR=#009900]{[/COLOR]
            [COLOR=#666666][I]//decode image size[/I][/COLOR]
            BitmapFactory.[COLOR=#006633]Options[/COLOR] o [COLOR=#339933]=[/COLOR] [B]new[/B] BitmapFactory.[COLOR=#006633]Options[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            o.[COLOR=#006633]inJustDecodeBounds[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
            BitmapFactory.[COLOR=#006633]decodeStream[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] [COLOR=#003399]FileInputStream[/COLOR][COLOR=#009900]([/COLOR]f[COLOR=#009900])[/COLOR],[COLOR=#000066][B]null[/B][/COLOR],o[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            
            [COLOR=#666666][I]//Find the correct scale value. It should be the power of 2.[/I][/COLOR]
            [B]final[/B] [COLOR=#000066][B]int[/B][/COLOR] REQUIRED_SIZE[COLOR=#339933]=[/COLOR][COLOR=#CC66CC]70[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#000066][B]int[/B][/COLOR] width_tmp[COLOR=#339933]=[/COLOR]o.[COLOR=#006633]outWidth[/COLOR], height_tmp[COLOR=#339933]=[/COLOR]o.[COLOR=#006633]outHeight[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#000066][B]int[/B][/COLOR] scale[COLOR=#339933]=[/COLOR][COLOR=#CC66CC]1[/COLOR][COLOR=#339933];[/COLOR]
            [B]while[/B][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                [B]if[/B][COLOR=#009900]([/COLOR]width_tmp[COLOR=#339933]/[/COLOR][COLOR=#CC66CC]2[/COLOR][COLOR=#339933]<[/COLOR]REQUIRED_SIZE [COLOR=#339933]||[/COLOR] height_tmp[COLOR=#339933]/[/COLOR][COLOR=#CC66CC]2[/COLOR][COLOR=#339933]<[/COLOR]REQUIRED_SIZE[COLOR=#009900])[/COLOR]
                    [B]break[/B][COLOR=#339933];[/COLOR]
                width_tmp[COLOR=#339933]/=[/COLOR][COLOR=#CC66CC]2[/COLOR][COLOR=#339933];[/COLOR]
                height_tmp[COLOR=#339933]/=[/COLOR][COLOR=#CC66CC]2[/COLOR][COLOR=#339933];[/COLOR]
                scale[COLOR=#339933]*=[/COLOR][COLOR=#CC66CC]2[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]
            
            [COLOR=#666666][I]//decode with inSampleSize[/I][/COLOR]
            BitmapFactory.[COLOR=#006633]Options[/COLOR] o2 [COLOR=#339933]=[/COLOR] [B]new[/B] BitmapFactory.[COLOR=#006633]Options[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            o2.[COLOR=#006633]inSampleSize[/COLOR][COLOR=#339933]=[/COLOR]scale[COLOR=#339933];[/COLOR]
            [B]return[/B] BitmapFactory.[COLOR=#006633]decodeStream[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] [COLOR=#003399]FileInputStream[/COLOR][COLOR=#009900]([/COLOR]f[COLOR=#009900])[/COLOR], [COLOR=#000066][B]null[/B][/COLOR], o2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]FileNotFoundException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR][COLOR=#009900]}[/COLOR]
        [B]return[/B] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
    
    [COLOR=#666666][I]//Task for the queue[/I][/COLOR]
    [B]private[/B] [B]class[/B] PhotoToLoad
    [COLOR=#009900]{[/COLOR]
        [B]public[/B] [COLOR=#003399]String[/COLOR] url[COLOR=#339933];[/COLOR]
        [B]public[/B] ImageView imageView[COLOR=#339933];[/COLOR]
        [B]public[/B] PhotoToLoad[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] u, ImageView i[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
            url[COLOR=#339933]=[/COLOR]u[COLOR=#339933];[/COLOR] 
            imageView[COLOR=#339933]=[/COLOR]i[COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
    [COLOR=#009900]}[/COLOR]
    
    [B]class[/B] PhotosLoader [B]implements[/B] [COLOR=#003399]Runnable[/COLOR] [COLOR=#009900]{[/COLOR]
        PhotoToLoad photoToLoad[COLOR=#339933];[/COLOR]
        PhotosLoader[COLOR=#009900]([/COLOR]PhotoToLoad photoToLoad[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
            [B]this[/B].[COLOR=#006633]photoToLoad[/COLOR][COLOR=#339933]=[/COLOR]photoToLoad[COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        
        @Override
        [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] run[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            [B]if[/B][COLOR=#009900]([/COLOR]imageViewReused[COLOR=#009900]([/COLOR]photoToLoad[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR]
                [B]return[/B][COLOR=#339933];[/COLOR]
            Bitmap bmp[COLOR=#339933]=[/COLOR]getBitmap[COLOR=#009900]([/COLOR]photoToLoad.[COLOR=#006633]url[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            memoryCache.[COLOR=#006633]put[/COLOR][COLOR=#009900]([/COLOR]photoToLoad.[COLOR=#006633]url[/COLOR], bmp[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]if[/B][COLOR=#009900]([/COLOR]imageViewReused[COLOR=#009900]([/COLOR]photoToLoad[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR]
                [B]return[/B][COLOR=#339933];[/COLOR]
            BitmapDisplayer bd[COLOR=#339933]=[/COLOR][B]new[/B] BitmapDisplayer[COLOR=#009900]([/COLOR]bmp, photoToLoad[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            Activity a[COLOR=#339933]=[/COLOR][COLOR=#009900]([/COLOR]Activity[COLOR=#009900])[/COLOR]photoToLoad.[COLOR=#006633]imageView[/COLOR].[COLOR=#006633]getContext[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            a.[COLOR=#006633]runOnUiThread[/COLOR][COLOR=#009900]([/COLOR]bd[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
    [COLOR=#009900]}[/COLOR]
    
    [COLOR=#000066][B]boolean[/B][/COLOR] imageViewReused[COLOR=#009900]([/COLOR]PhotoToLoad photoToLoad[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
        [COLOR=#003399]String[/COLOR] tag[COLOR=#339933]=[/COLOR]imageViews.[COLOR=#006633]get[/COLOR][COLOR=#009900]([/COLOR]photoToLoad.[COLOR=#006633]imageView[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [B]if[/B][COLOR=#009900]([/COLOR]tag[COLOR=#339933]==[/COLOR][COLOR=#000066][B]null[/B][/COLOR] [COLOR=#339933]||[/COLOR] [COLOR=#339933]![/COLOR]tag.[COLOR=#006633]equals[/COLOR][COLOR=#009900]([/COLOR]photoToLoad.[COLOR=#006633]url[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR]
            [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
        [B]return[/B] [COLOR=#000066][B]false[/B][/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
    
    [COLOR=#666666][I]//Used to display bitmap in the UI thread[/I][/COLOR]
    [B]class[/B] BitmapDisplayer [B]implements[/B] [COLOR=#003399]Runnable[/COLOR]
    [COLOR=#009900]{[/COLOR]
        Bitmap bitmap[COLOR=#339933];[/COLOR]
        PhotoToLoad photoToLoad[COLOR=#339933];[/COLOR]
        [B]public[/B] BitmapDisplayer[COLOR=#009900]([/COLOR]Bitmap b, PhotoToLoad p[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]bitmap[COLOR=#339933]=[/COLOR]b[COLOR=#339933];[/COLOR]photoToLoad[COLOR=#339933]=[/COLOR]p[COLOR=#339933];[/COLOR][COLOR=#009900]}[/COLOR]
        [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] run[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR]
        [COLOR=#009900]{[/COLOR]
            [B]if[/B][COLOR=#009900]([/COLOR]imageViewReused[COLOR=#009900]([/COLOR]photoToLoad[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR]
                [B]return[/B][COLOR=#339933];[/COLOR]
            [B]if[/B][COLOR=#009900]([/COLOR]bitmap[COLOR=#339933]!=[/COLOR][COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR]
                photoToLoad.[COLOR=#006633]imageView[/COLOR].[COLOR=#006633]setImageBitmap[/COLOR][COLOR=#009900]([/COLOR]bitmap[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]else[/B]
                photoToLoad.[COLOR=#006633]imageView[/COLOR].[COLOR=#006633]setImageResource[/COLOR][COLOR=#009900]([/COLOR]stub_id[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] clearCache[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        memoryCache.[COLOR=#006633]clear[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        fileCache.[COLOR=#006633]clear[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
نکته مهم :

با بزرگتر کردن عدد موجود در خط زیر از کدها می توانیم کیفیت عکس ها را بهتر کنیم (اگر از تغییر کیفیت عکس ها راضی نبودید، یک عدد بزرگتر انتخاب کنید) :
کد:
[FONT=monospace][B]final[/B] [COLOR=#000066][B]int[/B][/COLOR] REQUIRED_SIZE[COLOR=#339933]=[/COLOR][COLOR=#CC66CC]70[/COLOR][COLOR=#339933];[/COLOR][/FONT]
نکته مهم :

تا قبل از دانلود کامل عکس، یک عکس موقتی به جای آن در ImageView نمایش داده می شود، آن عکس را در خط زیر از کدها تعیین کرده ایم :
کد:
[FONT=monospace][B]final[/B] [COLOR=#000066][B]int[/B][/COLOR] stub_id[COLOR=#339933]=[/COLOR]R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]ic_launcher[/COLOR][COLOR=#339933];[/COLOR][/FONT]
کدهای فایل MemoryCache.java به صورت زیر می باشد :
کد:
[FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.imageloadercache[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]java.util.Collections[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.Iterator[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.LinkedHashMap[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.Map[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.Map.Entry[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.graphics.Bitmap[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.util.Log[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MemoryCache [COLOR=#009900]{[/COLOR]

    [B]private[/B] [B]static[/B] [B]final[/B] [COLOR=#003399]String[/COLOR] TAG [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"MemoryCache"[/COLOR][COLOR=#339933];[/COLOR]
    [B]private[/B] Map[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], Bitmap[COLOR=#339933]>[/COLOR] cache[COLOR=#339933]=[/COLOR][COLOR=#003399]Collections[/COLOR].[COLOR=#006633]synchronizedMap[/COLOR][COLOR=#009900]([/COLOR]
            [B]new[/B] LinkedHashMap[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], Bitmap[COLOR=#339933]>[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]10[/COLOR],1.5f,[COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][COLOR=#666666][I]//Last argument true for LRU ordering[/I][/COLOR]
    [B]private[/B] [COLOR=#000066][B]long[/B][/COLOR] size[COLOR=#339933]=[/COLOR][COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR][COLOR=#666666][I]//current allocated size[/I][/COLOR]
    [B]private[/B] [COLOR=#000066][B]long[/B][/COLOR] limit[COLOR=#339933]=[/COLOR][COLOR=#CC66CC]1000000[/COLOR][COLOR=#339933];[/COLOR][COLOR=#666666][I]//max memory in bytes[/I][/COLOR]

    [B]public[/B] MemoryCache[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
        [COLOR=#666666][I]//use 25% of available heap size[/I][/COLOR]
        setLimit[COLOR=#009900]([/COLOR][COLOR=#003399]Runtime[/COLOR].[COLOR=#006633]getRuntime[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]maxMemory[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933]/[/COLOR][COLOR=#CC66CC]4[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
    
    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] setLimit[COLOR=#009900]([/COLOR][COLOR=#000066][B]long[/B][/COLOR] new_limit[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
        limit[COLOR=#339933]=[/COLOR]new_limit[COLOR=#339933];[/COLOR]
        Log.[COLOR=#006633]i[/COLOR][COLOR=#009900]([/COLOR]TAG, [COLOR=#0000FF]"MemoryCache will use up to "[/COLOR][COLOR=#339933]+[/COLOR]limit[COLOR=#339933]/[/COLOR][COLOR=#CC66CC]1024[/COLOR].[COLOR=#339933]/[/COLOR][COLOR=#CC66CC]1024[/COLOR].[COLOR=#339933]+[/COLOR][COLOR=#0000FF]"MB"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [B]public[/B] Bitmap get[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] id[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
        [B]try[/B][COLOR=#009900]{[/COLOR]
            [B]if[/B][COLOR=#009900]([/COLOR][COLOR=#339933]![/COLOR]cache.[COLOR=#006633]containsKey[/COLOR][COLOR=#009900]([/COLOR]id[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR]
                [B]return[/B] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#666666][I]//NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78 [/I][/COLOR]
            [B]return[/B] cache.[COLOR=#006633]get[/COLOR][COLOR=#009900]([/COLOR]id[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR][B]catch[/B][COLOR=#009900]([/COLOR][COLOR=#003399]NullPointerException[/COLOR] ex[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
            ex.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]return[/B] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] put[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] id, Bitmap bitmap[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
        [B]try[/B][COLOR=#009900]{[/COLOR]
            [B]if[/B][COLOR=#009900]([/COLOR]cache.[COLOR=#006633]containsKey[/COLOR][COLOR=#009900]([/COLOR]id[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR]
                size[COLOR=#339933]-=[/COLOR]getSizeInBytes[COLOR=#009900]([/COLOR]cache.[COLOR=#006633]get[/COLOR][COLOR=#009900]([/COLOR]id[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            cache.[COLOR=#006633]put[/COLOR][COLOR=#009900]([/COLOR]id, bitmap[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            size[COLOR=#339933]+=[/COLOR]getSizeInBytes[COLOR=#009900]([/COLOR]bitmap[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            checkSize[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR][B]catch[/B][COLOR=#009900]([/COLOR][COLOR=#003399]Throwable[/COLOR] th[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
            th.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
    [COLOR=#009900]}[/COLOR]
    
    [B]private[/B] [COLOR=#000066][B]void[/B][/COLOR] checkSize[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        Log.[COLOR=#006633]i[/COLOR][COLOR=#009900]([/COLOR]TAG, [COLOR=#0000FF]"cache size="[/COLOR][COLOR=#339933]+[/COLOR]size[COLOR=#339933]+[/COLOR][COLOR=#0000FF]" length="[/COLOR][COLOR=#339933]+[/COLOR]cache.[COLOR=#006633]size[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [B]if[/B][COLOR=#009900]([/COLOR]size[COLOR=#339933]>[/COLOR]limit[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
            Iterator[COLOR=#339933]<[/COLOR]Entry[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], Bitmap[COLOR=#339933]>>[/COLOR] iter[COLOR=#339933]=[/COLOR]cache.[COLOR=#006633]entrySet[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]iterator[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][COLOR=#666666][I]//least recently accessed item will be the first one iterated  [/I][/COLOR]
            [B]while[/B][COLOR=#009900]([/COLOR]iter.[COLOR=#006633]hasNext[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                Entry[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], Bitmap[COLOR=#339933]>[/COLOR] entry[COLOR=#339933]=[/COLOR]iter.[COLOR=#006633]next[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                size[COLOR=#339933]-=[/COLOR]getSizeInBytes[COLOR=#009900]([/COLOR]entry.[COLOR=#006633]getValue[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                iter.[COLOR=#006633]remove[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [B]if[/B][COLOR=#009900]([/COLOR]size[COLOR=#339933]<=[/COLOR]limit[COLOR=#009900])[/COLOR]
                    [B]break[/B][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]
            Log.[COLOR=#006633]i[/COLOR][COLOR=#009900]([/COLOR]TAG, [COLOR=#0000FF]"Clean cache. New size "[/COLOR][COLOR=#339933]+[/COLOR]cache.[COLOR=#006633]size[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] clear[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]try[/B][COLOR=#009900]{[/COLOR]
            [COLOR=#666666][I]//NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78 [/I][/COLOR]
            cache.[COLOR=#006633]clear[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            size[COLOR=#339933]=[/COLOR][COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR][B]catch[/B][COLOR=#009900]([/COLOR][COLOR=#003399]NullPointerException[/COLOR] ex[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
            ex.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [COLOR=#000066][B]long[/B][/COLOR] getSizeInBytes[COLOR=#009900]([/COLOR]Bitmap bitmap[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]if[/B][COLOR=#009900]([/COLOR]bitmap[COLOR=#339933]==[/COLOR][COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR]
            [B]return[/B] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR]
        [B]return[/B] bitmap.[COLOR=#006633]getRowBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]*[/COLOR] bitmap.[COLOR=#006633]getHeight[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
کدهای فایل Utils.java به صورت زیر می باشد :
کد:
[FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.imageloadercache[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]java.io.InputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.OutputStream[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] Utils [COLOR=#009900]{[/COLOR]
    [B]public[/B] [B]static[/B] [COLOR=#000066][B]void[/B][/COLOR] CopyStream[COLOR=#009900]([/COLOR][COLOR=#003399]InputStream[/COLOR] is, [COLOR=#003399]OutputStream[/COLOR] os[COLOR=#009900])[/COLOR]
    [COLOR=#009900]{[/COLOR]
        [B]final[/B] [COLOR=#000066][B]int[/B][/COLOR] buffer_size[COLOR=#339933]=[/COLOR][COLOR=#CC66CC]1024[/COLOR][COLOR=#339933];[/COLOR]
        [B]try[/B]
        [COLOR=#009900]{[/COLOR]
            [COLOR=#000066][B]byte[/B][/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] bytes[COLOR=#339933]=[/COLOR][B]new[/B] [COLOR=#000066][B]byte[/B][/COLOR][COLOR=#009900][[/COLOR]buffer_size[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
            [B]for[/B][COLOR=#009900]([/COLOR][COLOR=#339933];;[/COLOR][COLOR=#009900])[/COLOR]
            [COLOR=#009900]{[/COLOR]
              [COLOR=#000066][B]int[/B][/COLOR] count[COLOR=#339933]=[/COLOR]is.[COLOR=#006633]read[/COLOR][COLOR=#009900]([/COLOR]bytes, [COLOR=#CC66CC]0[/COLOR], buffer_size[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
              [B]if[/B][COLOR=#009900]([/COLOR]count[COLOR=#339933]==-[/COLOR][COLOR=#CC66CC]1[/COLOR][COLOR=#009900])[/COLOR]
                  [B]break[/B][COLOR=#339933];[/COLOR]
              os.[COLOR=#006633]write[/COLOR][COLOR=#009900]([/COLOR]bytes, [COLOR=#CC66CC]0[/COLOR], count[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]
        [COLOR=#009900]}[/COLOR]
        [B]catch[/B][COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] ex[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR][COLOR=#009900]}[/COLOR]
    [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
اکنون باید کدهای مربوط به فایل xml متناظر با Activity اصلی برنامه اندروید (البته برنامه اندروید، تنها یک Activity دارد) را بنویسیم، یعنی فایل activity_main.xml :


961.jpg

کدهای فایل activity_main.xml را به صورت زیر می نویسیم :

کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]ScrollView xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
     android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
     android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR] [COLOR=#339933]>[/COLOR]

     [COLOR=#339933]<[/COLOR]LinearLayout
         android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
         android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
         android[COLOR=#339933]:[/COLOR]orientation[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"vertical"[/COLOR] [COLOR=#339933]>[/COLOR]

     [COLOR=#339933]<[/COLOR]ImageView
         android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@+id/imageView1"[/COLOR]
         android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
         android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"300dp"[/COLOR]
         android[COLOR=#339933]:[/COLOR]src[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR] [COLOR=#339933]/>[/COLOR]
     
     [COLOR=#339933]<[/COLOR]ImageView
         android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@+id/imageView2"[/COLOR]
         android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
         android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"300dp"[/COLOR]
         android[COLOR=#339933]:[/COLOR]src[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR] [COLOR=#339933]/>[/COLOR]
     
     [COLOR=#339933]<[/COLOR]ImageView
         android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@+id/imageView3"[/COLOR]
         android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
         android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"300dp"[/COLOR]
         android[COLOR=#339933]:[/COLOR]src[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR] [COLOR=#339933]/>[/COLOR]

     [COLOR=#339933]</[/COLOR]LinearLayout[COLOR=#339933]>[/COLOR]
     
[COLOR=#339933]</[/COLOR]ScrollView[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
همان طور که در کدهای بالا مشاهده می کنید، سه عنصر ImageView تعریف کرده ایم، زیرا باید سه عکس در این سه ImageView نمایش داده شوند.

اکنون باید کدهای Activity اصلی برنامه اندروید (با نام MainActivity.java) را بنویسیم :

960.jpg


کدهای فایل MainActivity.java عبارتند از :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.downloadimagecache[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.ImageView[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]com.kelidestan.imageloadercache.ImageLoader[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]
        
        [B]private[/B] ImageLoader imgLoader[COLOR=#339933];[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                imgLoader [COLOR=#339933]=[/COLOR] [B]new[/B] ImageLoader[COLOR=#009900]([/COLOR][B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] [COLOR=#666666][I]// important[/I][/COLOR]
                
                ImageView iv_1 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#003399]String[/COLOR] image_url_1 [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"http://www.kelidestan.com/fixed-url/Kelidestan_image_1.jpg"[/COLOR][COLOR=#339933];[/COLOR]
                imgLoader.[COLOR=#006633]DisplayImage[/COLOR][COLOR=#009900]([/COLOR]image_url_1, iv_1[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                ImageView iv_2 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView2[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#003399]String[/COLOR] image_url_2 [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"http://www.kelidestan.com/fixed-url/Kelidestan_image_2.jpg"[/COLOR][COLOR=#339933];[/COLOR]
                imgLoader.[COLOR=#006633]DisplayImage[/COLOR][COLOR=#009900]([/COLOR]image_url_2, iv_2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                ImageView iv_3 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView3[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#003399]String[/COLOR] image_url_3 [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"http://www.kelidestan.com/fixed-url/Kelidestan_image_3.jpg"[/COLOR][COLOR=#339933];[/COLOR]
                imgLoader.[COLOR=#006633]DisplayImage[/COLOR][COLOR=#009900]([/COLOR]image_url_3, iv_3[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]


[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون بخش های مهم آن را شرح می دهیم :

با خط زیر از کدها، یک شیء (object) از کلاس (class) با نام ImageLoader ساخته ایم (نام شیء را برابر imgLoader انتخاب کرده ایم و آن را به صورت private تعریف کرده ایم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]private[/B] ImageLoader imgLoader[COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
دقت شود که کلاس ImageLoader ، توسط یکی از همان 4 فایلی که گفتیم، تعریف شده است :962.jpg

بنابراین با روش های موجود در شیء imgLoader (که آنها را از کلاس ImageLoader به ارث برده است)، می توانیم عملیات های مربوط به دانلود عکس، ذخیره کردن آن در حافظه خارجی (External Storage) و عملیات های مربوط به cache و همچنین نمایش عکس در یک ImageView را انجام بدهیم.

این عملیات ها برای هر یک از سه ImageView ، مشابه می باشند. مثلا برای ImageView با id برابر imageView1 ، کدهای زیر نوشته شده است :
کد:
[FONT=monospace]ImageView iv_1 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#003399]String[/COLOR] image_url_1 [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"http://www.kelidestan.com/fixed-url/Kelidestan_image_1.jpg"[/COLOR][COLOR=#339933];[/COLOR]
imgLoader.[COLOR=#006633]DisplayImage[/COLOR][COLOR=#009900]([/COLOR]image_url_1, iv_1[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
مشاهده می کنید که از روش DisplayImage از شیء imgLoader استفاده کرده ایم که دو ورودی را دریافت می کند. اولین ورودی، یک رشته (String) است که در آن، آدرس اینترنتی (آدرس URL) مربوط به فایل عکس، ذخیره شده است و دومین ورودی، آن ImageView ای است که می خواهیم عکس در آن نمایش داده شود.

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


http://www.www.www.iran-eng.ir/attachment.php?attachmentid=247464&d=1437587874


http://www.www.www.iran-eng.ir/attachment.php?attachmentid=247463&d=1437587863

همچنین نگاهی به پوشه بندی گوشی اندروید می اندازیم و مشاهده می کنیم که پوشه با نام myFolder به درستی ساخته شده است :

954.jpg


درون پوشه myFolder هیچ فایلی وجود ندارد، زیرا تعیین کردیم که یک پوشه دیگر درون آن ساخته شود که چون علامت نقطه (.) در ابتدای نام آن است، به صورت پنهان (hidden) خواهد بود و کاربر نمی تواند آن را ببیند:

955.jpg

فایل های پروژه اندروید را می توانید از لینک های زیر دریافت کنید :
 

پیوست ها

  • 98.zip
    1.4 مگایابت · بازدیدها: 0
  • 99.rar
    264 کیلوبایت · بازدیدها: 0

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
نمایش یک عکس قرار گرفته در اینترنت (یک آدرس URL)، در یک ImageView ، در برنامه نویسی اندروید

نمایش یک عکس قرار گرفته در اینترنت (یک آدرس URL)، در یک ImageView ، در برنامه نویسی اندروید

فرض کنید که یک عکس در اینترنت قرار دارد و می خواهیم آن را در یک ImageView در برنامه اندروید خود نمایش بدهیم. آدرس اینترنتی (آدرس URL) عکس را به صورت آدرس فرضی زیر در نظر بگیرید (این آدرس را به آدرس URL مورد نظر خود تغییر بدهید) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http://www.kelidestan.com/images/image.png[/FONT]
[/FONT][/COLOR]
ابتدا یک تابع به صورت زیر تعریف می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]private[/B] [B]class[/B] DownloadImageTask [B]extends[/B] AsyncTask[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], [COLOR=#003399]Void[/COLOR], Bitmap[COLOR=#339933]>[/COLOR] [COLOR=#009900]{[/COLOR]
    ImageView bmImage[COLOR=#339933];[/COLOR]

    [B]public[/B] DownloadImageTask[COLOR=#009900]([/COLOR]ImageView bmImage[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]this[/B].[COLOR=#006633]bmImage[/COLOR] [COLOR=#339933]=[/COLOR] bmImage[COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [B]protected[/B] Bitmap doInBackground[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR]... [COLOR=#006633]urls[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [COLOR=#003399]String[/COLOR] urldisplay [COLOR=#339933]=[/COLOR] urls[COLOR=#009900][[/COLOR][COLOR=#CC66CC]0[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
        Bitmap mIcon11 [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
        [B]try[/B] [COLOR=#009900]{[/COLOR]
            [COLOR=#003399]InputStream[/COLOR] in [COLOR=#339933]=[/COLOR] [B]new[/B] java.[COLOR=#006633]net[/COLOR].[COLOR=#003399]URL[/COLOR][COLOR=#009900]([/COLOR]urldisplay[COLOR=#009900])[/COLOR].[COLOR=#006633]openStream[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            mIcon11 [COLOR=#339933]=[/COLOR] BitmapFactory.[COLOR=#006633]decodeStream[/COLOR][COLOR=#009900]([/COLOR]in[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            Log.[COLOR=#006633]e[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Error"[/COLOR], e.[COLOR=#006633]getMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        [B]return[/B] mIcon11[COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPostExecute[COLOR=#009900]([/COLOR]Bitmap result[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        bmImage.[COLOR=#006633]setImageBitmap[/COLOR][COLOR=#009900]([/COLOR]result[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
سپس با فرض اینکه ImageView ای که می خواهیم عکس در آن نمایش داده شود، دارای id برابر imageView1 باشد، کدهای زیر را می نویسیم (آدرس URL در کدها را به آدرس URL مورد نظر خود تغییر بدهید) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView imageView [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[B]new[/B] DownloadImageTask[COLOR=#009900]([/COLOR]imageView[COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"http://www.kelidestan.com/images/image.png"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
دقت کنید که حتما باید اجازه دسترسی به اینترنت، به برنامه اندروید افزوده شود، بنابراین فایل AndroidManifest.xml پروژه اندروید را باز کرده و کد زیر را به آن اضافه می کنیم (افزودن اجازه دسترسی به اینترنت) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
[h=4]نکته :[/h]بد نیست تذکر داده شود که برای بارگذاری عکس از اینترنت و سپس نمایش آن در ImageView ، از AsyncTask استفاده کرده ایم. بهتر است که در فایل xml ای که ImageView را تعریف کرده اید، ابتدا یک عکس پیش فرض تعیین کنید تا در حین بارگذاری عکس از اینترنت، در ImageView نمایش داده شود و بعد از بارگذاری عکس از اینترنت، عکس اینترنتی در ImageView نمایش داده می شود.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
روشی دیگر برای نمایش یک عکس قرار گرفته در اینترنت (یک آدرس URL)، در یک ImageView ، در برنامه نویسی اندروید

روشی دیگر برای نمایش یک عکس قرار گرفته در اینترنت (یک آدرس URL)، در یک ImageView ، در برنامه نویسی اندروید

در مبحثی دیگر، نحوه نمایش یک عکس قرار گرفته در اینترنت در یک ImageView را شرح دادیم. این بار قصد داریم که روشی دیگر را بیان کنیم، زیرا بر اساس پیچیدگی برنامه اندروید، ممکن است که به روش های متفاوتی نیاز پیدا کنیم و بنابراین در سایت کلیدستان سعی می کنیم که کدها و روش های مختلفی ارائه شود.

در پروژه اندروید، یک کلاس با نام DrawableManager می سازیم (یعنی یک فایل با نام DrawableManager.java). کدهای کلاس DrawableManager را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.imageload[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]java.io.IOException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.InputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.MalformedURLException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.HashMap[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.Map[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]org.apache.http.HttpResponse[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.client.methods.HttpGet[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.impl.client.DefaultHttpClient[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.graphics.drawable.Drawable[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Handler[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Message[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.util.Log[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.ImageView[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] DrawableManager [COLOR=#009900]{[/COLOR]
   [B]private[/B] [B]final[/B] Map[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], Drawable[COLOR=#339933]>[/COLOR] drawableMap[COLOR=#339933];[/COLOR]

   [B]public[/B] DrawableManager[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
       drawableMap [COLOR=#339933]=[/COLOR] [B]new[/B] HashMap[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], Drawable[COLOR=#339933]>[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
   [COLOR=#009900]}[/COLOR]

   [B]public[/B] Drawable fetchDrawable[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] urlString[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
       [B]if[/B] [COLOR=#009900]([/COLOR]drawableMap.[COLOR=#006633]containsKey[/COLOR][COLOR=#009900]([/COLOR]urlString[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           [B]return[/B] drawableMap.[COLOR=#006633]get[/COLOR][COLOR=#009900]([/COLOR]urlString[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR]

       Log.[COLOR=#006633]d[/COLOR][COLOR=#009900]([/COLOR][B]this[/B].[COLOR=#006633]getClass[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getSimpleName[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"image url:"[/COLOR] [COLOR=#339933]+[/COLOR] urlString[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
       [B]try[/B] [COLOR=#009900]{[/COLOR]
           [COLOR=#003399]InputStream[/COLOR] is [COLOR=#339933]=[/COLOR] fetch[COLOR=#009900]([/COLOR]urlString[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] 
           Drawable drawable [COLOR=#339933]=[/COLOR] Drawable.[COLOR=#006633]createFromStream[/COLOR][COLOR=#009900]([/COLOR]is, [COLOR=#0000FF]"src"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]


           [B]if[/B] [COLOR=#009900]([/COLOR]drawable [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
               drawableMap.[COLOR=#006633]put[/COLOR][COLOR=#009900]([/COLOR]urlString, drawable[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               Log.[COLOR=#006633]d[/COLOR][COLOR=#009900]([/COLOR][B]this[/B].[COLOR=#006633]getClass[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getSimpleName[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"got a thumbnail drawable: "[/COLOR] [COLOR=#339933]+[/COLOR]drawable.[COLOR=#006633]getBounds[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]", "[/COLOR]
                       [COLOR=#339933]+[/COLOR] drawable.[COLOR=#006633]getIntrinsicHeight[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]","[/COLOR] [COLOR=#339933]+[/COLOR] drawable.[COLOR=#006633]getIntrinsicWidth[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]", "[/COLOR]
                       [COLOR=#339933]+[/COLOR] drawable.[COLOR=#006633]getMinimumHeight[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]","[/COLOR] [COLOR=#339933]+[/COLOR] drawable.[COLOR=#006633]getMinimumWidth[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [COLOR=#009900]}[/COLOR] [B]else[/B] [COLOR=#009900]{[/COLOR]
             Log.[COLOR=#006633]w[/COLOR][COLOR=#009900]([/COLOR][B]this[/B].[COLOR=#006633]getClass[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getSimpleName[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"could not get thumbnail"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [COLOR=#009900]}[/COLOR]

           [B]return[/B] drawable[COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]MalformedURLException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           Log.[COLOR=#006633]e[/COLOR][COLOR=#009900]([/COLOR][B]this[/B].[COLOR=#006633]getClass[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getSimpleName[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"fetchDrawable failed"[/COLOR], e[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [B]return[/B] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           Log.[COLOR=#006633]e[/COLOR][COLOR=#009900]([/COLOR][B]this[/B].[COLOR=#006633]getClass[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getSimpleName[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"fetchDrawable failed"[/COLOR], e[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [B]return[/B] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR]
   [COLOR=#009900]}[/COLOR]

   [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] fetchDrawableOnThread[COLOR=#009900]([/COLOR][B]final[/B] [COLOR=#003399]String[/COLOR] urlString, [B]final[/B] ImageView imageView[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR] 
       [B]if[/B] [COLOR=#009900]([/COLOR]drawableMap.[COLOR=#006633]containsKey[/COLOR][COLOR=#009900]([/COLOR]urlString[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           imageView.[COLOR=#006633]setImageDrawable[/COLOR][COLOR=#009900]([/COLOR]drawableMap.[COLOR=#006633]get[/COLOR][COLOR=#009900]([/COLOR]urlString[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR]

       [B]final[/B] Handler handler [COLOR=#339933]=[/COLOR] [B]new[/B] Handler[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           @Override
           [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] handleMessage[COLOR=#009900]([/COLOR]Message message[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
               [COLOR=#666666][I]// imageView.setImageDrawable((Drawable) message.obj);[/I][/COLOR]
               imageView.[COLOR=#006633]setBackgroundDrawable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900]([/COLOR]Drawable[COLOR=#009900])[/COLOR] message.[COLOR=#006633]obj[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [COLOR=#009900]}[/COLOR]
       [COLOR=#009900]}[/COLOR][COLOR=#339933];[/COLOR]

       [COLOR=#003399]Thread[/COLOR] thread [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]Thread[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           @Override
           [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] run[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
               [COLOR=#666666][I]//TODO : set imageView to a "pending" image[/I][/COLOR]
               Drawable drawable [COLOR=#339933]=[/COLOR] fetchDrawable[COLOR=#009900]([/COLOR]urlString[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] 
               Message message [COLOR=#339933]=[/COLOR] handler.[COLOR=#006633]obtainMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]1[/COLOR], drawable[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               handler.[COLOR=#006633]sendMessage[/COLOR][COLOR=#009900]([/COLOR]message[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [COLOR=#009900]}[/COLOR]
       [COLOR=#009900]}[/COLOR][COLOR=#339933];[/COLOR]
       thread.[COLOR=#006633]start[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
   [COLOR=#009900]}[/COLOR]

   [B]private[/B] [COLOR=#003399]InputStream[/COLOR] fetch[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] urlString[COLOR=#009900])[/COLOR] [B]throws[/B] [COLOR=#003399]MalformedURLException[/COLOR], [COLOR=#003399]IOException[/COLOR] [COLOR=#009900]{[/COLOR]
       DefaultHttpClient httpClient [COLOR=#339933]=[/COLOR] [B]new[/B] DefaultHttpClient[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
       HttpGet request [COLOR=#339933]=[/COLOR] [B]new[/B] HttpGet[COLOR=#009900]([/COLOR]urlString[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
       HttpResponse response [COLOR=#339933]=[/COLOR] httpClient.[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR]request[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
       [B]return[/B] response.[COLOR=#006633]getEntity[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getContent[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
   [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
دقت کنید که نام package که در خط اول کدها نوشته شده است را باید به نام package پروژه اندروید خود تغییر بدهید.

فرض کنید که آدرس اینترنتی (آدرس URL) عکس، به صورت زیر باشد (یک آدرس فرضی) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http://www.kelidestan.com/images/image.png[/FONT]
[/FONT][/COLOR]
اکنون فرض کنید که در یک activity از برنامه اندروید، بخواهیم همان عکسی که آدرس URL آن را ذکر کردیم، در یک ImageView نمایش بدهیم. برای این منظور، کدهای زیر را در میان کدهای آن activity می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView iv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] result.[COLOR=#006633]findViewById[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
DrawableManager dm [COLOR=#339933]=[/COLOR] [B]new[/B] DrawableManager[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
dm.[COLOR=#006633]fetchDrawableOnThread[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"http://www.kelidestan.com/images/image.png"[/COLOR],iv[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
در کد بالا، فرض کرده ایم که ImageView دارای id برابر imageView1 باشد.

دقت کنید که حتما باید اجازه دسترسی به اینترنت، به برنامه اندروید افزوده شود، بنابراین فایل AndroidManifest.xml پروژه اندروید را باز کرده و کد زیر را به آن اضافه می کنیم (افزودن اجازه دسترسی به اینترنت) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
دانلود یک فایل از یک آدرس اینترنتی (یک URL) و نمایش میزان پیشرفت (با ProgressDialog) ، در برنامه نوسی اندروید

دانلود یک فایل از یک آدرس اینترنتی (یک URL) و نمایش میزان پیشرفت (با ProgressDialog) ، در برنامه نوسی اندروید

در زیر، کدهای یک activity را نوشته ایم که دارای نام MainActivity بوده (می توانید نام آن را تغییر بدهید) و برای دانلود یک فایل از یک آدرس اینترنتی و ذخیره آن در حافظه خارجی (external storage) به کار می رود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.iran-eng.download[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]java.io.FileOutputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.IOException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.InputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.OutputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.HttpURLConnection[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.URL[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.app.ProgressDialog[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.Context[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.DialogInterface[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.AsyncTask[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.PowerManager[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.Toast[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]
        
        [B]public[/B] ProgressDialog mProgressDialog[COLOR=#339933];[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                [COLOR=#666666][I]// instantiate it within the onCreate method[/I][/COLOR]
                mProgressDialog [COLOR=#339933]=[/COLOR] [B]new[/B] ProgressDialog[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] [COLOR=#666666][I]// MainActivity = activity name[/I][/COLOR]
                mProgressDialog.[COLOR=#006633]setMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"A message"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                mProgressDialog.[COLOR=#006633]setIndeterminate[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                mProgressDialog.[COLOR=#006633]setProgressStyle[/COLOR][COLOR=#009900]([/COLOR]ProgressDialog.[COLOR=#006633]STYLE_HORIZONTAL[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                mProgressDialog.[COLOR=#006633]setCancelable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                [COLOR=#666666][I]// execute this when the downloader must be fired[/I][/COLOR]
                [B]final[/B] DownloadTask downloadTask [COLOR=#339933]=[/COLOR] [B]new[/B] DownloadTask[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] [COLOR=#666666][I]// MainActivity = activity name[/I][/COLOR]
                downloadTask.[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"http://www.kelidestan.com/file.apk"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] [COLOR=#666666][I]// the url to the file you want to download[/I][/COLOR]
                
                mProgressDialog.[COLOR=#006633]setOnCancelListener[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] DialogInterface.[COLOR=#006633]OnCancelListener[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                    @Override
                    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onCancel[COLOR=#009900]([/COLOR]DialogInterface dialog[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        downloadTask.[COLOR=#006633]cancel[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                [COLOR=#009900]}[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

        
        [COLOR=#666666][I]// usually, subclasses of AsyncTask are declared inside the activity class.[/I][/COLOR]
        [COLOR=#666666][I]// that way, you can easily modify the UI thread from here[/I][/COLOR]
        [B]private[/B] [B]class[/B] DownloadTask [B]extends[/B] AsyncTask[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], [COLOR=#003399]Integer[/COLOR], String[COLOR=#339933]>[/COLOR] [COLOR=#009900]{[/COLOR]

            [B]private[/B] [COLOR=#003399]Context[/COLOR] context[COLOR=#339933];[/COLOR]

            [B]public[/B] DownloadTask[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] context[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]this[/B].[COLOR=#006633]context[/COLOR] [COLOR=#339933]=[/COLOR] context[COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]

            @Override
            [B]protected[/B] [COLOR=#003399]String[/COLOR] doInBackground[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR]... [COLOR=#006633]sUrl[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [COLOR=#666666][I]// take CPU lock to prevent CPU from going off if the user [/I][/COLOR]
                [COLOR=#666666][I]// presses the power button during download[/I][/COLOR]
                PowerManager pm [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]PowerManager[COLOR=#009900])[/COLOR] context.[COLOR=#006633]getSystemService[/COLOR][COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR].[COLOR=#006633]POWER_SERVICE[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                PowerManager.[COLOR=#006633]WakeLock[/COLOR] wl [COLOR=#339933]=[/COLOR] pm.[COLOR=#006633]newWakeLock[/COLOR][COLOR=#009900]([/COLOR]PowerManager.[COLOR=#006633]PARTIAL_WAKE_LOCK[/COLOR],
                     getClass[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getName[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                wl.[COLOR=#006633]acquire[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                [B]try[/B] [COLOR=#009900]{[/COLOR]
                    [COLOR=#003399]InputStream[/COLOR] input [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#003399]OutputStream[/COLOR] output [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#003399]HttpURLConnection[/COLOR] connection [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
                    [B]try[/B] [COLOR=#009900]{[/COLOR]
                        [COLOR=#003399]URL[/COLOR] url [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]URL[/COLOR][COLOR=#009900]([/COLOR]sUrl[COLOR=#009900][[/COLOR][COLOR=#CC66CC]0[/COLOR][COLOR=#009900]][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        connection [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#003399]HttpURLConnection[/COLOR][COLOR=#009900])[/COLOR] url.[COLOR=#006633]openConnection[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        connection.[COLOR=#006633]connect[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                        [COLOR=#666666][I]// expect HTTP 200 OK, so we don't mistakenly save error report [/I][/COLOR]
                        [COLOR=#666666][I]// instead of the file[/I][/COLOR]
                        [B]if[/B] [COLOR=#009900]([/COLOR]connection.[COLOR=#006633]getResponseCode[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]!=[/COLOR] [COLOR=#003399]HttpURLConnection[/COLOR].[COLOR=#006633]HTTP_OK[/COLOR][COLOR=#009900])[/COLOR]
                             [B]return[/B] [COLOR=#0000FF]"Server returned HTTP "[/COLOR] [COLOR=#339933]+[/COLOR] connection.[COLOR=#006633]getResponseCode[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] 
                                 [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]" "[/COLOR] [COLOR=#339933]+[/COLOR] connection.[COLOR=#006633]getResponseMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                        [COLOR=#666666][I]// this will be useful to display download percentage[/I][/COLOR]
                        [COLOR=#666666][I]// might be -1: server did not report the length[/I][/COLOR]
                        [COLOR=#000066][B]int[/B][/COLOR] fileLength [COLOR=#339933]=[/COLOR] connection.[COLOR=#006633]getContentLength[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                        [COLOR=#666666][I]// download the file[/I][/COLOR]
                        input [COLOR=#339933]=[/COLOR] connection.[COLOR=#006633]getInputStream[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        output [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]FileOutputStream[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"/sdcard/myFile.apk"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]  [COLOR=#666666][I]//   /sdcard/file_name.extension[/I][/COLOR]

                        [COLOR=#000066][B]byte[/B][/COLOR] data[COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#000066][B]byte[/B][/COLOR][COLOR=#009900][[/COLOR][COLOR=#CC66CC]4096[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#000066][B]long[/B][/COLOR] total [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#000066][B]int[/B][/COLOR] count[COLOR=#339933];[/COLOR]
                        [B]while[/B] [COLOR=#009900]([/COLOR][COLOR=#009900]([/COLOR]count [COLOR=#339933]=[/COLOR] input.[COLOR=#006633]read[/COLOR][COLOR=#009900]([/COLOR]data[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]!=[/COLOR] [COLOR=#339933]-[/COLOR][COLOR=#CC66CC]1[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                            [COLOR=#666666][I]// allow canceling with back button[/I][/COLOR]
                            [B]if[/B] [COLOR=#009900]([/COLOR]isCancelled[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR]
                                [B]return[/B] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
                            total [COLOR=#339933]+=[/COLOR] count[COLOR=#339933];[/COLOR]
                            [COLOR=#666666][I]// publishing the progress....[/I][/COLOR]
                            [B]if[/B] [COLOR=#009900]([/COLOR]fileLength [COLOR=#339933]>[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#666666][I]// only if total length is known[/I][/COLOR]
                                publishProgress[COLOR=#009900]([/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]([/COLOR]total [COLOR=#339933]*[/COLOR] [COLOR=#CC66CC]100[/COLOR] [COLOR=#339933]/[/COLOR] fileLength[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            output.[COLOR=#006633]write[/COLOR][COLOR=#009900]([/COLOR]data, [COLOR=#CC66CC]0[/COLOR], count[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        [B]return[/B] e.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]finally[/B] [COLOR=#009900]{[/COLOR]
                        [B]try[/B] [COLOR=#009900]{[/COLOR]
                            [B]if[/B] [COLOR=#009900]([/COLOR]output [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR]
                                output.[COLOR=#006633]close[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            [B]if[/B] [COLOR=#009900]([/COLOR]input [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR]
                                input.[COLOR=#006633]close[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR] 
                        [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] ignored[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR] [COLOR=#009900]}[/COLOR]

                        [B]if[/B] [COLOR=#009900]([/COLOR]connection [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR]
                            connection.[COLOR=#006633]disconnect[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                [COLOR=#009900]}[/COLOR] [B]finally[/B] [COLOR=#009900]{[/COLOR]
                    wl.[COLOR=#006633]release[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR]
                [B]return[/B] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]
            
            @Override
            [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPreExecute[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onPreExecute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                mProgressDialog.[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]

            @Override
            [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onProgressUpdate[COLOR=#009900]([/COLOR][COLOR=#003399]Integer[/COLOR]... [COLOR=#006633]progress[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onProgressUpdate[/COLOR][COLOR=#009900]([/COLOR]progress[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#666666][I]// if we get here, length is known, now set indeterminate to false[/I][/COLOR]
                mProgressDialog.[COLOR=#006633]setIndeterminate[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                mProgressDialog.[COLOR=#006633]setMax[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]100[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                mProgressDialog.[COLOR=#006633]setProgress[/COLOR][COLOR=#009900]([/COLOR]progress[COLOR=#009900][[/COLOR][COLOR=#CC66CC]0[/COLOR][COLOR=#009900]][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]

            @Override
            [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPostExecute[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] result[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                mProgressDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [B]if[/B] [COLOR=#009900]([/COLOR]result [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR]
                    Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]context,[COLOR=#0000FF]"Download error: "[/COLOR][COLOR=#339933]+[/COLOR]result, Toast.[COLOR=#006633]LENGTH_LONG[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [B]else[/B]
                    Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]context,[COLOR=#0000FF]"File downloaded"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]
            
        [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
در کدهای بالا، نام package پروژه اندروید، در اولین خط نوشته شده که باید آن را بر اساس پروژه اندروید خود تغییر بدهید. همچنین هنگام تغییر نام Activity ، دقت کنید که نام Activity در چند جای کدها نوشته شده و باید همگی آنها را تغییر بدهید.

در کد بالا، برای مسیر و نام فایلی که باید در حافظه خارجی (external storage) ذخیره شود، این مسیر و نام را تعیین کرده ایم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]/[/COLOR]sdcard[COLOR=#339933]/[/COLOR]myFile.[COLOR=#006633]apk[/COLOR][/FONT]
[/FONT][/COLOR]
که باعث می شود فایلی با نام myFile.apk در فولدر اصلی گوشی ساخته شود. در صورت تمایل می توانید نام فایل را تغییر بدهید یا در فولدر اصلی گوشی، یک فولدر ساخته و سپس مسیر آن فولدر را به مسیر اضافه کنید (ساخت فولدر با کدنویسی امکان پذیر است، در مبحثی دیگر در سایت کلیدستان، آن را شرح داده ایم).

در کدها، آدرس فایلی که باید دانلود شود را به صورت زیر تعیین کرده ایم (این آدرس، یک آدرس فرضی است و باید آن را به آدرس اینترنتی مورد نظر خود تغییر بدهید) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http://www.www.www.iran-eng.ir/file.apk[/FONT]
[/FONT][/COLOR]
[h=4]نکته مهم :[/h]دقت شود که باید کدهای زیر به کدهای فایل AndroidManifest.xml پروژه اندروید افزوده شود (چند اجازه که باید به پروژه اندروید بدهیم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR]
[COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.WRITE_EXTERNAL_STORAGE"[/COLOR] [COLOR=#339933]/>[/COLOR]
[COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.READ_EXTERNAL_STORAGE"[/COLOR] [COLOR=#339933]/>[/COLOR]
[COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.WAKE_LOCK"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
[h=4]نکته مهم (تصحیح کد) :[/h]در برخی از گوشی ها، شیوه آدرس دهی زیر باعث بروز خطا می شود (به دلیل شیوه آدرس دهی به فولدر اصلی حافظه خارجی) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]output [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]FileOutputStream[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"/sdcard/myFile.apk"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]  [COLOR=#666666][I]//   /sdcard/file_name.extension[/I][/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین توصیه می شود که به جای خط بالا از کدها، کد زیر را بنویسید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]File[/COLOR] root [COLOR=#339933]=[/COLOR] android.[COLOR=#006633]os[/COLOR].[COLOR=#003399]Environment[/COLOR].[COLOR=#006633]getExternalStorageDirectory[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
output [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]FileOutputStream[/COLOR][COLOR=#009900]([/COLOR]root.[COLOR=#006633]getAbsolutePath[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]"/myFile.apk"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]  [/FONT]
[/FONT][/COLOR]
بعد از این تغییر، کلیدهای Ctrl و Shift و O (حرف او) از کیبورد را به صورت همزمان بزنید تا package های مورد نیاز import شوند.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
چک کردن متصل بودن گوشی کاربر به اینترنت، در برنامه نویسی اندروید

چک کردن متصل بودن گوشی کاربر به اینترنت، در برنامه نویسی اندروید

در این مبحث، دو روش برای چک کردن اتصال به اینترنت را ارائه می کنیم. البته توصیه می شود که از روش اول استفاده کنید.

روش اول :

این روش، در اموزش 7م همین تاپیک، مورد استفاده قرار گرفته است و چنانچه یک پروژه اندروید ساخته شده با آن را می خواهید، به کلید (مبحث) مورد نظر مراجعه کنید.قبل از هر چیز، باید اجازه های دسترسی زیر را به فایل AndroidManifest.xml از پروژه اندروید اضافه کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR]
[COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.ACCESS_NETWORK_STATE"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
سپس در Activity ، یک کلاس (class) به صورت زیر تعریف می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]         [COLOR=#008000][B][I]/**
         * Async Task to check whether internet connection is working.
         **/[/I][/B][/COLOR]

            [B]private[/B] [B]class[/B] NetCheck [B]extends[/B] AsyncTask[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR],[COLOR=#003399]String[/COLOR],Boolean[COLOR=#339933]>[/COLOR]
            [COLOR=#009900]{[/COLOR]
                [B]private[/B] ProgressDialog nDialog[COLOR=#339933];[/COLOR]

                @Override
                [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPreExecute[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                    [B]super[/B].[COLOR=#006633]onPreExecute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog [COLOR=#339933]=[/COLOR] [B]new[/B] ProgressDialog[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setTitle[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Checking Network"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Loading.."[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setIndeterminate[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setCancelable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                    nDialog.[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR]
                [COLOR=#008000][B][I]/**
                 * Gets current device state and checks for working internet connection by trying Google.
                **/[/I][/B][/COLOR]
                @Override
                [B]protected[/B] [COLOR=#003399]Boolean[/COLOR] doInBackground[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR]... [COLOR=#006633]args[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]

                    ConnectivityManager cm [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ConnectivityManager[COLOR=#009900])[/COLOR]getSystemService[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR].[COLOR=#006633]CONNECTIVITY_SERVICE[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    NetworkInfo netInfo [COLOR=#339933]=[/COLOR] cm.[COLOR=#006633]getActiveNetworkInfo[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [B]if[/B] [COLOR=#009900]([/COLOR]netInfo [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR] [COLOR=#339933]&&[/COLOR] netInfo.[COLOR=#006633]isConnected[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        [B]try[/B] [COLOR=#009900]{[/COLOR]
                            [COLOR=#003399]URL[/COLOR] url [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]URL[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"http://www.google.com"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            [COLOR=#003399]HttpURLConnection[/COLOR] urlc [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#003399]HttpURLConnection[/COLOR][COLOR=#009900])[/COLOR] url.[COLOR=#006633]openConnection[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            urlc.[COLOR=#006633]setConnectTimeout[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]3000[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            urlc.[COLOR=#006633]connect[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            [B]if[/B] [COLOR=#009900]([/COLOR]urlc.[COLOR=#006633]getResponseCode[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]==[/COLOR] [COLOR=#CC66CC]200[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                                [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
                            [COLOR=#009900]}[/COLOR]
                        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]MalformedURLException[/COLOR] e1[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                            [COLOR=#666666][I]// TODO Auto-generated catch block[/I][/COLOR]
                            e1.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                            [COLOR=#666666][I]// TODO Auto-generated catch block[/I][/COLOR]
                            e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                    [B]return[/B] [COLOR=#000066][B]false[/B][/COLOR][COLOR=#339933];[/COLOR]

                [COLOR=#009900]}[/COLOR]
                @Override
                [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPostExecute[COLOR=#009900]([/COLOR][COLOR=#003399]Boolean[/COLOR] th[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]

                    [B]if[/B][COLOR=#009900]([/COLOR]th [COLOR=#339933]==[/COLOR] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                        nDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [B]new[/B] GetData[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                    [B]else[/B][COLOR=#009900]{[/COLOR]
                        nDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]getApplicationContext[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"Error in Network Connection"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                [COLOR=#009900]}[/COLOR]
            [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
دقت شود که در کد بالا، خط زیر، کدهایی است که در صورت درست بودن اتصال به اینترنت، می خواهیم اجرا شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]new[/B] GetData[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
پس یک کلاس با نام GetData باید بسازید که حاوی کدهای لازم باشد (که اگر اتصال به اینترنت، درست بود، اجرا شود و در غیر این صورت، پیامی توسط روش Toast به کاربر نمایش داده شود.)

نحوه اجرا کردن کدهای کلاس NetCheck (ساخت شیء (object) از روی این کلاس و سپس اجرا کردن کدهای آن)، برای چک کردن اینترنت، به صورت زیر می باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]new[/B] NetCheck[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
روش دوم :

با استفاده از تابع زیر می توانیم چک کنیم که آیا گوشی کاربر به اینترنت متصل است یا نه :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]private[/B] [COLOR=#000066][B]boolean[/B][/COLOR] isNetworkConnected[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR] [COLOR=#666666][I]// check internet connection[/I][/COLOR]
ConnectivityManager cm [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ConnectivityManager[COLOR=#009900])[/COLOR] getSystemService[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR].[COLOR=#006633]CONNECTIVITY_SERVICE[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
NetworkInfo ni [COLOR=#339933]=[/COLOR] cm.[COLOR=#006633]getActiveNetworkInfo[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[B]if[/B] [COLOR=#009900]([/COLOR]ni [COLOR=#339933]==[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    [COLOR=#666666][I]// There are no active networks.[/I][/COLOR]
    [B]return[/B] [COLOR=#000066][B]false[/B][/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR] [B]else[/B]
    [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
دقت شود که دو خط زیر را باید به کدهای فایل AndroidManifest.xml پروژه اندروید اضافه کنیم (افزودن اجازه های دسترسی) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.ACCESS_WIFI_STATE"[/COLOR] [COLOR=#339933]/>[/COLOR]
[COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.ACCESS_NETWORK_STATE"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین اگر می خواهیم کدی بنویسیم که مربوط به اینترنت است، باید آنها را به صورت کلی زیر بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]if[/B][COLOR=#009900]([/COLOR]isNetworkConnected[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR] [COLOR=#666666][I]// check internet connection[/I][/COLOR]
    [COLOR=#666666][I]// your codes[/I][/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
که در آن، باید به جای عبارت // your codes ، کدهای مورد نظرمان را بنویسیم.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
چک کردن اتصال به اینترنت، به همراه نمایش یک پیام و دو گزینه ((تلاش مجدد)) و ((بی خیال)) هنگام عدم اتصال به اینترنت

چک کردن اتصال به اینترنت، به همراه نمایش یک پیام و دو گزینه ((تلاش مجدد)) و ((بی خیال)) هنگام عدم اتصال به اینترنت

چک کردن اتصال به اینترنت، به همراه نمایش یک پیام و دو گزینه ((تلاش مجدد)) و ((بی خیال)) هنگام عدم اتصال به اینترنت، با استفاده از AlertDialog ، در برنامه نویسی اندروید :

در مبحث های دیگر، چگونگی چک کردن اتصال به اینترنت و چگونگی نمایش یک پیام، به همراه دو گزینه، به کاربر، با استفاده از AlertDialog را در همین تاپیک شرح داده ایم. اکنون قصد داریم که در یک پروژه اندروید، این دو را با هم ترکیب کنیم و برنامه اندروید، ابتدا چک کند که آیا گوشی اندروید کاربر به اینترنت متصل می باشد یا خیر، اگر متصل است، یک سری کد اجرا شود و اگر به اینترنت متصل نباشد، با استفاده از AlertDialog ، یک پیام با عنوان خطا در اتصال به اینترنت، به کاربر نمایش داده شود و همچنین دو گزینه در پنجره مربوط به پیام وجود دارد که کاربر می تواند انتخاب کند که دوباره، اتصال به اینترنت (و بعد از آن، اجرای کدهای مورد نظرمان) صورت گیرد یا خیر.
برنامه اندروید، شامل یک دکمه (Button) است که با اشاره کاربر بر روی آن، اتصال گوشی به اینترنت، چک می شود :


171.jpg

برای چک کردن برنامه، اتصال گوشی به اینترنت را قطع می کنیم و بعد بر روی دکمه اشاره می کنیم. پنجره زیر نمایش داده می شود :


172.jpg

و اگر گوشی به اینترنت متصل باشد، پیام کوتاه زیر نمایش داده می شود :

173.jpg

در ادامه، بخش های مهم پروژه اندروید را شرح می دهیم و در انتها نیز، لینک هایی برای دانلود پروژه اندروید، موجود است.

در برنامه eclipse ، ابتدا یک پروژه اندروید با نام CheckInternet می سازیم (نام package را برابر com.kelidestan.checkinternet انتخاب می کنیم. نام Activity اصلی را برابر MainActivity انتخاب می کنیم و فایل xml متناظر آن را هم برابر activity_main قرار می دهیم).

قبل از هر چیز، باید اجازه های دسترسی زیر را به فایل AndroidManifest.xml اضافه کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR]
[COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.ACCESS_NETWORK_STATE"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین کدهای فایل AndroidManifest.xml به صورت زیر خواهد بود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]manifest xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    [B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.checkinternet"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionCode[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionName[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]sdk
        android[COLOR=#339933]:[/COLOR]minSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"8"[/COLOR]
        android[COLOR=#339933]:[/COLOR]targetSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"18"[/COLOR] [COLOR=#339933]/>[/COLOR]
    
    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR]
    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.ACCESS_NETWORK_STATE"[/COLOR] [COLOR=#339933]/>[/COLOR]

    [COLOR=#339933]<[/COLOR]application
        android[COLOR=#339933]:[/COLOR]allowBackup[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR]
        android[COLOR=#339933]:[/COLOR]icon[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR]
        android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR]
        android[COLOR=#339933]:[/COLOR]theme[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@style/AppTheme"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.checkinternet.MainActivity"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR] [COLOR=#339933]>[/COLOR]
            [COLOR=#339933]<[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
                [COLOR=#339933]<[/COLOR]action android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.action.MAIN"[/COLOR] [COLOR=#339933]/>[/COLOR]

                [COLOR=#339933]<[/COLOR]category android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.category.LAUNCHER"[/COLOR] [COLOR=#339933]/>[/COLOR]
            [COLOR=#339933]</[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]</[/COLOR]application[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]manifest[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
رشته های (string) مورد نظرمان را در فایل strings.xml تعریف می کنیم :

167.jpg

کدهای فایل strings.xml را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]resources[COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"app_name"[/COLOR][COLOR=#339933]>[/COLOR]CheckInternet[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"action_settings"[/COLOR][COLOR=#339933]>[/COLOR]Settings[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"hello_world"[/COLOR][COLOR=#339933]>[/COLOR]Hello world[COLOR=#339933]!</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"title"[/COLOR][COLOR=#339933]>[/COLOR]خطا در اتصال به اینترنت[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"message"[/COLOR][COLOR=#339933]>[/COLOR]متاسفانه در اتصال به اینترنت، خطایی رخ داده است [COLOR=#339933]!</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"yes"[/COLOR][COLOR=#339933]>[/COLOR]تلاش دوباره[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"no"[/COLOR][COLOR=#339933]>[/COLOR]بی خیال[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"button"[/COLOR][COLOR=#339933]>[/COLOR]چک کردن اتصال به اینترنت[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]resources[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
فایل activity_main.xml ، فایل xml متناظر با MainActivity.java می باشد :

168.jpg


کدهای فایل activity_main.xml را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]LinearLayout xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    xmlns[COLOR=#339933]:[/COLOR]tools[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/tools"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingBottom[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_vertical_margin"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingLeft[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_horizontal_margin"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingRight[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_horizontal_margin"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingTop[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_vertical_margin"[/COLOR]
    tools[COLOR=#339933]:[/COLOR]context[COLOR=#339933]=[/COLOR][COLOR=#0000FF]".MainActivity"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR][COLOR=#003399]Button[/COLOR]
        android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@+id/button1"[/COLOR]
        android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
        android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"wrap_content"[/COLOR]
        android[COLOR=#339933]:[/COLOR]text[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/button"[/COLOR] [COLOR=#339933]/>[/COLOR]

[COLOR=#339933]</[/COLOR]LinearLayout[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
همان طور که مشاهده می کنید، در آن، تنها یک دکمه (Button) تعریف کرده ایم. ظاهر گرافیکی فایل activity_main.xml به صورت زیر می باشد :

170.jpg

فایل MainActivity.java ، فایل مروبط به Activity (تنها Activity) برنامه اندروید می باشد :


169.jpg

کدهای فایل MainActivity.java را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.checkinternet[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]java.io.IOException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.HttpURLConnection[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.MalformedURLException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.URL[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.app.AlertDialog[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.app.ProgressDialog[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.Context[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.DialogInterface[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.net.ConnectivityManager[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.net.NetworkInfo[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.AsyncTask[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.View[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.View.OnClickListener[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.Button[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.Toast[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                [COLOR=#003399]Button[/COLOR] b [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#003399]Button[/COLOR][COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]button1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                b.[COLOR=#006633]setOnClickListener[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] OnClickListener[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                                          
                     @Override
                     [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onClick[COLOR=#009900]([/COLOR][COLOR=#003399]View[/COLOR] v[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                         [B]new[/B] NetCheck[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                     [COLOR=#009900]}[/COLOR]
                [COLOR=#009900]}[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
        [COLOR=#009900]}[/COLOR]

        [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] ShowAlertDialog[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        AlertDialog.[COLOR=#006633]Builder[/COLOR] alertDialog [COLOR=#339933]=[/COLOR] [B]new[/B] AlertDialog.[COLOR=#006633]Builder[/COLOR][COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        alertDialog.[COLOR=#006633]setTitle[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]string[/COLOR].[COLOR=#006633]title[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        alertDialog.[COLOR=#006633]setMessage[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]string[/COLOR].[COLOR=#006633]message[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        alertDialog.[COLOR=#006633]setIcon[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]ic_launcher[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#666666][I]// Setting Positive "Yes" Button[/I][/COLOR]
        alertDialog.[COLOR=#006633]setPositiveButton[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]string[/COLOR].[COLOR=#006633]yes[/COLOR],
                        [B]new[/B] DialogInterface.[COLOR=#006633]OnClickListener[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onClick[COLOR=#009900]([/COLOR]DialogInterface dialog, [COLOR=#000066][B]int[/B][/COLOR] which[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        dialog.[COLOR=#006633]cancel[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [B]new[/B] NetCheck[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                [COLOR=#009900]}[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#666666][I]// Setting Negative "NO" Button[/I][/COLOR]
        alertDialog.[COLOR=#006633]setNegativeButton[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]string[/COLOR].[COLOR=#006633]no[/COLOR],
                [B]new[/B] DialogInterface.[COLOR=#006633]OnClickListener[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onClick[COLOR=#009900]([/COLOR]DialogInterface dialog, [COLOR=#000066][B]int[/B][/COLOR] which[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        [COLOR=#666666][I]// Write your code here to invoke NO event[/I][/COLOR]
                        dialog.[COLOR=#006633]cancel[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                [COLOR=#009900]}[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#666666][I]// Showing Alert Message[/I][/COLOR]
        alertDialog.[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
        
        
        [COLOR=#008000][B][I]/**
    * Async Task to check whether internet connection is working.
    **/[/I][/B][/COLOR]

       [B]private[/B] [B]class[/B] NetCheck [B]extends[/B] AsyncTask[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR],[COLOR=#003399]String[/COLOR],Boolean[COLOR=#339933]>[/COLOR]
       [COLOR=#009900]{[/COLOR]
           [B]private[/B] ProgressDialog nDialog[COLOR=#339933];[/COLOR]

           @Override
           [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPreExecute[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
               [B]super[/B].[COLOR=#006633]onPreExecute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               nDialog [COLOR=#339933]=[/COLOR] [B]new[/B] ProgressDialog[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               nDialog.[COLOR=#006633]setTitle[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Checking Network"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               nDialog.[COLOR=#006633]setMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Loading.."[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               nDialog.[COLOR=#006633]setIndeterminate[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               nDialog.[COLOR=#006633]setCancelable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

               nDialog.[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [COLOR=#009900]}[/COLOR]
           [COLOR=#008000][B][I]/**
            * Gets current device state and checks for working internet connection by trying Google.
           **/[/I][/B][/COLOR]
           @Override
           [B]protected[/B] [COLOR=#003399]Boolean[/COLOR] doInBackground[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR]... [COLOR=#006633]args[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]

               ConnectivityManager cm [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ConnectivityManager[COLOR=#009900])[/COLOR]getSystemService[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR].[COLOR=#006633]CONNECTIVITY_SERVICE[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               NetworkInfo netInfo [COLOR=#339933]=[/COLOR] cm.[COLOR=#006633]getActiveNetworkInfo[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               [B]if[/B] [COLOR=#009900]([/COLOR]netInfo [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR] [COLOR=#339933]&&[/COLOR] netInfo.[COLOR=#006633]isConnected[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                   [B]try[/B] [COLOR=#009900]{[/COLOR]
                       [COLOR=#003399]URL[/COLOR] url [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]URL[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"http://www.google.com"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       [COLOR=#003399]HttpURLConnection[/COLOR] urlc [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#003399]HttpURLConnection[/COLOR][COLOR=#009900])[/COLOR] url.[COLOR=#006633]openConnection[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       urlc.[COLOR=#006633]setConnectTimeout[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]3000[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       urlc.[COLOR=#006633]connect[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       [B]if[/B] [COLOR=#009900]([/COLOR]urlc.[COLOR=#006633]getResponseCode[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]==[/COLOR] [COLOR=#CC66CC]200[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                           [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
                       [COLOR=#009900]}[/COLOR]
                   [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]MalformedURLException[/COLOR] e1[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                       [COLOR=#666666][I]// TODO Auto-generated catch block[/I][/COLOR]
                       e1.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                       [COLOR=#666666][I]// TODO Auto-generated catch block[/I][/COLOR]
                       e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#009900]}[/COLOR]
               [COLOR=#009900]}[/COLOR]
               [B]return[/B] [COLOR=#000066][B]false[/B][/COLOR][COLOR=#339933];[/COLOR]

           [COLOR=#009900]}[/COLOR]
           @Override
           [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPostExecute[COLOR=#009900]([/COLOR][COLOR=#003399]Boolean[/COLOR] th[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]

               [B]if[/B][COLOR=#009900]([/COLOR]th [COLOR=#339933]==[/COLOR] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                   nDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]getApplicationContext[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"Your device is connected to internet !"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#666666][I]// new GetData().execute();[/I][/COLOR]
               [COLOR=#009900]}[/COLOR]
               [B]else[/B][COLOR=#009900]{[/COLOR]
                   nDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   ShowAlertDialog[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               [COLOR=#009900]}[/COLOR]
           [COLOR=#009900]}[/COLOR]
       [COLOR=#009900]}[/COLOR]


[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
چون قبلا این کدها را در دو مبحث دیگر، شرح داده ایم، از تکرار آن توضیحات خودداری می کنم و تنها اشاره ای به خط زیر از کدها می کنم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#666666][I]// new GetData().execute();[/I][/COLOR][/FONT]
[/FONT][/COLOR]
این خط از کدها را به صورت توضیح نوشته ایم، زیرا به جای آن، یک پیام کوتاه با استفاده از روش Toast به کاربر نمایش می دهیم که صحیح بودن اتصال گوشی به اینترنت را اعلام می کند، اما شاید شما بخواهید که حجم زیادی کد پس از چک کردن اینترنت و صحیح بودن اتصال اینترنت، اجرا کنید. برای این منظور، این خط از کدها را از حالت توضیح (comment) در بیاورید و سپس یک کلاس با نام GetData تعریف کرده و کدهای مورد نظرتان را در آن بنویسید. اگر برای این مورد (یعنی تعریف کدهایی در کلاس GetData)، یک مثال عملی می خواهید، کلید (مبحث) زیر را بخوانید : پست بعدی

فایل های پروژه اندروید را می توانید از لینک های زیر دانلود کنید :
 

پیوست ها

  • 7.zip
    929.7 کیلوبایت · بازدیدها: 0
  • 8.rar
    262 کیلوبایت · بازدیدها: 0

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
استفاده از HttpGet برای دریافت اطلاعات از یک صفحه اینترنتی (آدرس URL)، با روش GET و به صورت AsyncTask ، در برنامه نویسی اندروید

استفاده از HttpGet برای دریافت اطلاعات از یک صفحه اینترنتی (آدرس URL)، با روش GET و به صورت AsyncTask ، در برنامه نویسی اندروید

در این مبحث قصد داریم که نحوه استفاده از HttpGet برای دریافت اطلاعات از یک صفحه اینترنتی (یک URL) را شرح بدهیم. همان طور که از نام HttpGet مشخص است، HttpGet از روش GET برای دریافت اطلاعات از صفحه اینترنتی استفاده می کند.

برای این مبحث آموزشی، از آدرس اینترنتی زیر استفاده می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http://www.www.www.iran-eng.ir/fixed-url/kelidestan-1.php[/FONT]
[/FONT][/COLOR]
همان طور که مشاهده می کنید، صفحه اینترنتی مورد نظر، در سایت (http://www.www.www.iran-eng.ir) قرار دارد و آن را در پوشه ای (folder) به نام fixed-url قرار داده ایم. نام این پوشه، به این دلیل برایر fixed-url انتخاب شده است، که در آینده حواسمان باشد که نباید آدرس URL صفحات موجود در این پوشه، تغییر کند، بنابراین شما با خیال راحت و بدون نگرانی از تغییر آدرس URL و یا محتوای صفحات، می توانید از آنها استفاده کنید.

در صفحه kelidestan-1.php ، کدهای PHP زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]<?php[/B]
[COLOR=#B1B100]if[/COLOR][COLOR=#009900]([/COLOR][COLOR=#990000]isset[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$_GET[/COLOR][COLOR=#009900][[/COLOR][COLOR=#0000FF]'name'[/COLOR][COLOR=#009900]][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]&&[/COLOR] [COLOR=#990000]isset[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$_GET[/COLOR][COLOR=#009900][[/COLOR][COLOR=#0000FF]'city'[/COLOR][COLOR=#009900]][/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
    [COLOR=#000088]$name[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#000088]$_GET[/COLOR][COLOR=#009900][[/COLOR][COLOR=#0000FF]'name'[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#000088]$name[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#990000]htmlspecialchars[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$name[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#000088]$name[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#990000]strip_tags[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$name[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
    [COLOR=#000088]$city[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#000088]$_GET[/COLOR][COLOR=#009900][[/COLOR][COLOR=#0000FF]'city'[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#000088]$city[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#990000]htmlspecialchars[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$city[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#000088]$city[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#990000]strip_tags[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$city[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
    [COLOR=#B1B100]echo[/COLOR] [COLOR=#0000FF]"name : "[/COLOR][COLOR=#339933].[/COLOR][COLOR=#000088]$name[/COLOR][COLOR=#339933].[/COLOR][COLOR=#0000FF]" --- city : "[/COLOR][COLOR=#339933].[/COLOR][COLOR=#000088]$city[/COLOR][COLOR=#339933].[/COLOR][COLOR=#0000FF]""[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR]
[B]?>[/B][/FONT]
[/FONT][/COLOR]
بنابراین کدهای PHP صفحه، ابتدا چک می کنند که مقادیری برای دو متغیر name و city ، با روش GET ، به صفحه ارسال شده باشد (اگر ارسال نشده باشد، هیچ کد دیگری اجرا نمی شود و خروجی به صورت صفحه خالی خواهد بود). سپس در صورتی که برای هر دو متغیر، مقدار به صفحه ارسال شده باشد، مقادیر دریافت شده و در دو متغیر با همان نام ها، ذخیره می شود. سپس یک عبارت که در آن، مقدار متغیرها نیز وجود دارد، در خروجی چاپ می شود.

اگر در کدها دقت کنید، دو تابع htmlspecialchars و strip_tags را بر روی مقادیر دریافت شده، اعمال کرده ایم. این عمل برای ایجاد امنیت بیشتر است زیرا ممکن است که یک کاربر، به عنوان هکر، تعدادی کد مخرب را در میان ورودی ها قرار بدهد. در این مورد، در مبحثی دیگر صحبت خواهیم کرد، اما بد نیست به طور مختصر بگوییم که تابع htmlspecialchars ، باعث می شود که هنگام چاپ یک عبارت در خروجی صفحه، اگر تگ های (tags) مربوط به HTML در آن عبارت وجود دارند، به جای اجرا شدن به عنوان کد، تنها در خروجی نمایش داده شوند. همچنین تابع strip_tags ، برای حذف تگ های HTML و PHP موجود در یک عبارت به کار می رود. اگر در آینده بخش های امنیتی بیشتری به این کدها اضافه کنیم، شما مطمئن باشید که در خروجی صفحات تاثیری نخواهد داشت و با اطمینان می توانید از این صفحات استفاده کنید (همان طور که گفتیم، آدرس URL آنها همیشه ثابت خواهد بود و عملکرد آنها تغییری نخواهد کرد و فقط ممکن است صلاح بدانیم که بخشی از کدهای امنیتی را در اینجا نمایش ندهیم).

برای تعیین مقدار برای متغیرها (به روش GET)، باید آدرس اینترنتی زیر را در مرورگر خود اجرا کنید (مقادیر انتخابی برای دو متغیر، در آدرس URL صفحه، نوشته می شود):
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http://www.kelidestan.com/fixed-url/kelidestan-1.php?name=hamid[COLOR=#DDBB00]&city=tehran[/COLOR][/FONT]
[/FONT][/COLOR]
خروجی صفحه، به صورت زیر می باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]name : hamid --- city : tehran[/FONT]
[/FONT][/COLOR]
استفاده از مرورگر اینترنت، تنها برای آزمایش عملکرد صفحه بود، اما اکنون که از صحیح بودن عملکرد صفحه اینترنتی مطمئن شده ایم، می خواهیم در برنامه اندروید خود، از کدهایی استفاده کنیم که همین دو مقدار را برای دو متغیر، به صفحه ارسال کند و سپس نتیجه را از صفحه دریافت کرده و در یک TextView به ما نمایش بدهد.

قبل از هر چیز، باید به برنامه اندروید خود، اجازه دسترسی به اینترنت را بدهیم. برای این منظور، باید کد زیر را به کدهای فایل AndroidManifest.xml پروژه اندروید، اضافه کنیم:
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
علاوه بر این، بخشی از کدها نیز برای چک کردن اتصال به اینترنت می باشد و برای آنها، باید اجازه دسترسی زیر نیز به فایل AndroidManifest.xml افزوده شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.ACCESS_NETWORK_STATE"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
فرض کنید که نام package پروژه اندروید، برابر com.kelidestan.httpget و نام activity اصلی آن برابر MainActivity.java و نام فایل xml متناظر با activity اصلی برابر activity_main.xml باشد.

با توجه به فرض هایی که بیان کردیم، کدهای فایل AndroidManifest.xml ، به صورت زیر خواهد بود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]manifest xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    [B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.httpget"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionCode[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionName[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]sdk
        android[COLOR=#339933]:[/COLOR]minSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"8"[/COLOR] [COLOR=#339933]/>[/COLOR]
    
    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR]
    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.ACCESS_NETWORK_STATE"[/COLOR] [COLOR=#339933]/>[/COLOR]

    [COLOR=#339933]<[/COLOR]application
        android[COLOR=#339933]:[/COLOR]allowBackup[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR]
        android[COLOR=#339933]:[/COLOR]icon[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR]
        android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR]
        android[COLOR=#339933]:[/COLOR]theme[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@style/AppTheme"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.httpget.MainActivity"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR] [COLOR=#339933]>[/COLOR]
            [COLOR=#339933]<[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
                [COLOR=#339933]<[/COLOR]action android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.action.MAIN"[/COLOR] [COLOR=#339933]/>[/COLOR]

                [COLOR=#339933]<[/COLOR]category android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.category.LAUNCHER"[/COLOR] [COLOR=#339933]/>[/COLOR]
            [COLOR=#339933]</[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]</[/COLOR]application[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]manifest[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
همچنین کدهای فایل activity_main.xml به صورت زیر می باشد (در آن یک TextView تعریف کرده ایم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]RelativeLayout xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    xmlns[COLOR=#339933]:[/COLOR]tools[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/tools"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingBottom[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_vertical_margin"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingLeft[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_horizontal_margin"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingRight[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_horizontal_margin"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingTop[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_vertical_margin"[/COLOR]
    tools[COLOR=#339933]:[/COLOR]context[COLOR=#339933]=[/COLOR][COLOR=#0000FF]".MainActivity"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]TextView
        android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@+id/textView1"[/COLOR]
        android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"wrap_content"[/COLOR]
        android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"wrap_content"[/COLOR] [COLOR=#339933]/>[/COLOR]

[COLOR=#339933]</[/COLOR]RelativeLayout[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
و کدهای فایل MainActivity.java که همان activity اصلی پروژه اندروید است را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.httpget[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]java.io.BufferedReader[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.IOException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.InputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.InputStreamReader[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.UnsupportedEncodingException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.HttpURLConnection[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.MalformedURLException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.URL[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]org.apache.http.HttpEntity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.HttpResponse[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.client.ClientProtocolException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.client.methods.HttpGet[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.impl.client.DefaultHttpClient[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.app.ProgressDialog[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.Context[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.net.ConnectivityManager[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.net.NetworkInfo[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.AsyncTask[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.util.Log[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.TextView[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.Toast[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                [B]new[/B] NetCheck[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

        [COLOR=#008000][B][I]/**
         * Async Task to check whether internet connection is working.
         **/[/I][/B][/COLOR]

            [B]private[/B] [B]class[/B] NetCheck [B]extends[/B] AsyncTask[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR],[COLOR=#003399]String[/COLOR],Boolean[COLOR=#339933]>[/COLOR]
            [COLOR=#009900]{[/COLOR]
                [B]private[/B] ProgressDialog nDialog[COLOR=#339933];[/COLOR]

                @Override
                [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPreExecute[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                    [B]super[/B].[COLOR=#006633]onPreExecute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog [COLOR=#339933]=[/COLOR] [B]new[/B] ProgressDialog[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setTitle[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Checking Network"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Loading.."[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setIndeterminate[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setCancelable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                    nDialog.[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR]
                [COLOR=#008000][B][I]/**
                 * Gets current device state and checks for working internet connection by trying Google.
                **/[/I][/B][/COLOR]
                @Override
                [B]protected[/B] [COLOR=#003399]Boolean[/COLOR] doInBackground[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR]... [COLOR=#006633]args[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]

                    ConnectivityManager cm [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ConnectivityManager[COLOR=#009900])[/COLOR]getSystemService[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR].[COLOR=#006633]CONNECTIVITY_SERVICE[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    NetworkInfo netInfo [COLOR=#339933]=[/COLOR] cm.[COLOR=#006633]getActiveNetworkInfo[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [B]if[/B] [COLOR=#009900]([/COLOR]netInfo [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR] [COLOR=#339933]&&[/COLOR] netInfo.[COLOR=#006633]isConnected[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        [B]try[/B] [COLOR=#009900]{[/COLOR]
                            [COLOR=#003399]URL[/COLOR] url [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]URL[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"http://www.google.com"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            [COLOR=#003399]HttpURLConnection[/COLOR] urlc [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#003399]HttpURLConnection[/COLOR][COLOR=#009900])[/COLOR] url.[COLOR=#006633]openConnection[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            urlc.[COLOR=#006633]setConnectTimeout[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]3000[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            urlc.[COLOR=#006633]connect[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            [B]if[/B] [COLOR=#009900]([/COLOR]urlc.[COLOR=#006633]getResponseCode[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]==[/COLOR] [COLOR=#CC66CC]200[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                                [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
                            [COLOR=#009900]}[/COLOR]
                        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]MalformedURLException[/COLOR] e1[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                            [COLOR=#666666][I]// TODO Auto-generated catch block[/I][/COLOR]
                            e1.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                            [COLOR=#666666][I]// TODO Auto-generated catch block[/I][/COLOR]
                            e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                    [B]return[/B] [COLOR=#000066][B]false[/B][/COLOR][COLOR=#339933];[/COLOR]

                [COLOR=#009900]}[/COLOR]
                @Override
                [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPostExecute[COLOR=#009900]([/COLOR][COLOR=#003399]Boolean[/COLOR] th[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]

                    [B]if[/B][COLOR=#009900]([/COLOR]th [COLOR=#339933]==[/COLOR] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                        nDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [B]new[/B] GetData[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                    [B]else[/B][COLOR=#009900]{[/COLOR]
                        nDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]getApplicationContext[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"Error in Network Connection"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                [COLOR=#009900]}[/COLOR]
            [COLOR=#009900]}[/COLOR]
            
            
            [COLOR=#008000][B][I]/**
             * Async Task to get data from URL
             **/[/I][/B][/COLOR]
            [B]private[/B] [B]class[/B] GetData [B]extends[/B] AsyncTask[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], [COLOR=#003399]String[/COLOR], String[COLOR=#339933]>[/COLOR] [COLOR=#009900]{[/COLOR]

                [B]private[/B] ProgressDialog pDialog[COLOR=#339933];[/COLOR]
                [B]private[/B] [COLOR=#003399]InputStream[/COLOR] is [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
                [B]private[/B] [COLOR=#003399]String[/COLOR] url [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"http://www.kelidestan.com/fixed-url/kelidestan-1.php?name=hamid&city=tehran"[/COLOR][COLOR=#339933];[/COLOR]
                [B]private[/B] [COLOR=#003399]String[/COLOR] page_output [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]""[/COLOR][COLOR=#339933];[/COLOR]

                @Override
                [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPreExecute[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                    [B]super[/B].[COLOR=#006633]onPreExecute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                    pDialog [COLOR=#339933]=[/COLOR] [B]new[/B] ProgressDialog[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    pDialog.[COLOR=#006633]setTitle[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Contacting Servers"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    pDialog.[COLOR=#006633]setMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Logging in ..."[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    pDialog.[COLOR=#006633]setIndeterminate[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    pDialog.[COLOR=#006633]setCancelable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    pDialog.[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR]

                @Override
                [B]protected[/B] [COLOR=#003399]String[/COLOR] doInBackground[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR]... [COLOR=#006633]args[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]

                        [B]try[/B] [COLOR=#009900]{[/COLOR]
                        [COLOR=#666666][I]// defaultHttpClient[/I][/COLOR]
                        DefaultHttpClient httpClient [COLOR=#339933]=[/COLOR] [B]new[/B] DefaultHttpClient[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        HttpGet httpGet [COLOR=#339933]=[/COLOR] [B]new[/B] HttpGet[COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        HttpResponse httpResponse [COLOR=#339933]=[/COLOR] httpClient.[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR]httpGet[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        HttpEntity httpEntity [COLOR=#339933]=[/COLOR] httpResponse.[COLOR=#006633]getEntity[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        is [COLOR=#339933]=[/COLOR] httpEntity.[COLOR=#006633]getContent[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]UnsupportedEncodingException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR]ClientProtocolException e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                    [B]try[/B] [COLOR=#009900]{[/COLOR]
                        [COLOR=#003399]BufferedReader[/COLOR] reader [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]BufferedReader[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] [COLOR=#003399]InputStreamReader[/COLOR][COLOR=#009900]([/COLOR]
                                is, [COLOR=#0000FF]"iso-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#CC66CC]8[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        StringBuilder sb [COLOR=#339933]=[/COLOR] [B]new[/B] StringBuilder[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#003399]String[/COLOR] line [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
                        [B]while[/B] [COLOR=#009900]([/COLOR][COLOR=#009900]([/COLOR]line [COLOR=#339933]=[/COLOR] reader.[COLOR=#006633]readLine[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                            sb.[COLOR=#006633]append[/COLOR][COLOR=#009900]([/COLOR]line [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]"[COLOR=#000099][B]\n[/B][/COLOR]"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR]
                        is.[COLOR=#006633]close[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        page_output [COLOR=#339933]=[/COLOR] sb.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        Log.[COLOR=#006633]e[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Buffer Error"[/COLOR], [COLOR=#0000FF]"Error converting result "[/COLOR] [COLOR=#339933]+[/COLOR] e.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                    
                    [B]return[/B] page_output[COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR]

                @Override
                [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPostExecute[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] page_output[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        pDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [B]try[/B] [COLOR=#009900]{[/COLOR]
                        [COLOR=#666666][I]// display output of internet page (page_output string)[/I][/COLOR]
                        TextView tv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TextView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        tv.[COLOR=#006633]setText[/COLOR][COLOR=#009900]([/COLOR]page_output[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
               [COLOR=#009900]}[/COLOR]
            [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اگر در کدها دقت کنید، دو بار از AsyncTask استفاده کرده ایم. در واقع، دو کلاس (class) تعریف کرده ایم که هر کدام به صورت AsyncTask می باشند. AsyncTask به این صورت است که ابتدا یک ProgressDialog به شما نمایش داده می شود تا بدانید که یک سری فرآیند (کد) در حال اجرا شدن می باشد، سپس پس از پایان اجرای کدها، آن ProgressDialog ناپدید شده و نتیجه به شما نمایش داده می شود (یا هر مورد دیگر). استفاده از AsyncTask بسیار مهم می باشد زیرا همیشه باید کدهایی را که نمی دانیم اجرای آنها چه مدت طول می کشد را با AsyncTask اجرا کنیم.

کلاس اول دارای نام NetCheck می باشد و برای چک کردن اتصال به اینترنت به کار می رود. سپس اگر گوشی کاربر به اینترنت متصل باشد، کلاس دوم که دارای نام GetData است، فراخوانی می شود. اگر به کدهای روش onCreate دقت کنید، ابتدا با کد زیر، کلاس NetCheck را اجرا می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]new[/B] NetCheck[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
کلاس NetCheck ، وضعیت اتصال به اینترنت را چک می کند و اگر گوشی کاربر به اینترنت متصل باشد، آنگاه کلاس GetData را اجرا خواهد کرد که برای دریافت اطلاعات از آدرس اینترنتی می باشد.

به کدهای زیر دقت کنید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]                     [B]try[/B] [COLOR=#009900]{[/COLOR]
                         [COLOR=#666666][I]// defaultHttpClient[/I][/COLOR]
                         DefaultHttpClient httpClient [COLOR=#339933]=[/COLOR] [B]new[/B] DefaultHttpClient[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                         HttpGet httpGet [COLOR=#339933]=[/COLOR] [B]new[/B] HttpGet[COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                         HttpResponse httpResponse [COLOR=#339933]=[/COLOR] httpClient.[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR]httpGet[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                         HttpEntity httpEntity [COLOR=#339933]=[/COLOR] httpResponse.[COLOR=#006633]getEntity[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                         is [COLOR=#339933]=[/COLOR] httpEntity.[COLOR=#006633]getContent[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                     [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]UnsupportedEncodingException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                         e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                     [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR]ClientProtocolException e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                         e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                     [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                         e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                     [COLOR=#009900]}[/COLOR]
                     [B]try[/B] [COLOR=#009900]{[/COLOR]
                         [COLOR=#003399]BufferedReader[/COLOR] reader [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]BufferedReader[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] [COLOR=#003399]InputStreamReader[/COLOR][COLOR=#009900]([/COLOR]
                                 is, [COLOR=#0000FF]"iso-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#CC66CC]8[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                         StringBuilder sb [COLOR=#339933]=[/COLOR] [B]new[/B] StringBuilder[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                         [COLOR=#003399]String[/COLOR] line [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
                         [B]while[/B] [COLOR=#009900]([/COLOR][COLOR=#009900]([/COLOR]line [COLOR=#339933]=[/COLOR] reader.[COLOR=#006633]readLine[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                             sb.[COLOR=#006633]append[/COLOR][COLOR=#009900]([/COLOR]line [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]"[COLOR=#000099][B]\n[/B][/COLOR]"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                         [COLOR=#009900]}[/COLOR]
                         is.[COLOR=#006633]close[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                         page_output [COLOR=#339933]=[/COLOR] sb.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                     [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                         Log.[COLOR=#006633]e[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Buffer Error"[/COLOR], [COLOR=#0000FF]"Error converting result "[/COLOR] [COLOR=#339933]+[/COLOR] e.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                     [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
در کدهای فوق، متغیر url به صورت رشته (string) می باشد که آدرس URL صفحه اینترنتی در آن ذخیره شده است. با استفاده از httpGet ، اطلاعات را از صفحه اینترنتی دریافت کرده ایم و سپس خروجی صفحه در یک رشته با نام page_output ذخیره می شود (که بعدا آن را در TextView نمایش خواهیم داد).

اگر برنامه را بر روی یک گوشی واقعی نصب کنیم، نتیجه به صورت زیر خواهد بود (البته قبل از نمایش نتیجه، دو بار، ProgressDialog نمایش داده می شود) :

android-227.jpg

فایل های پروژه اندروید را می توانید از لینک های زیر دریافت کنید :
 

پیوست ها

  • 115.zip
    931.7 کیلوبایت · بازدیدها: 0
  • 116.rar
    260.3 کیلوبایت · بازدیدها: 0

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
استفاده از HttpPost برای دریافت اطلاعات از یک صفحه اینترنتی (آدرس URL)، با روش POST و به صورت AsyncTask ، در برنامه نویسی اندروید

استفاده از HttpPost برای دریافت اطلاعات از یک صفحه اینترنتی (آدرس URL)، با روش POST و به صورت AsyncTask ، در برنامه نویسی اندروید

در مبحثی دیگر، با نحوه استفاده از HttpGet برای دریافت اطلاعات از یک آدرس URL ، آشنا شدیم. در این مبحث قصد داریم که HttpPost را بررسی کنیم، که همان طور که از نامش مشخص است، از روش POST استفاده می کند. ساختار کلی کدها و توضیحات آنها، مشابه همان مبحث HttpGet است، بنابراین همان توضیحات را در اینجا نیز تکرار می کنیم و البته بخش های مهم مربوط به HttpPost را نیز شرح خواهیم داد.

برای این مبحث آموزشی، از آدرس اینترنتی زیر استفاده می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http://www.www.www.iran-eng.ir/fixed-url/kelidestan-2.php[/FONT]
[/FONT][/COLOR]
همان طور که مشاهده می کنید، صفحه اینترنتی مورد نظر، در سایت کلیدستان (http://www.www.www.iran-eng.ir) قرار دارد و آن را در پوشه ای (folder) به نام fixed-url قرار داده ایم. نام این پوشه، به این دلیل برایر fixed-url انتخاب شده است، که در آینده حواسمان باشد که نباید آدرس URL صفحات موجود در این پوشه، تغییر کند، بنابراین شما با خیال راحت و بدون نگرانی از تغییر آدرس URL و یا محتوای صفحات، می توانید از آنها استفاده کنید.

در صفحه kelidestan-2.php ، کدهای PHP زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]<?php[/B]
[COLOR=#B1B100]if[/COLOR][COLOR=#009900]([/COLOR][COLOR=#990000]isset[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$_POST[/COLOR][COLOR=#009900][[/COLOR][COLOR=#0000FF]'country'[/COLOR][COLOR=#009900]][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]&&[/COLOR] [COLOR=#990000]isset[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$_POST[/COLOR][COLOR=#009900][[/COLOR][COLOR=#0000FF]'age'[/COLOR][COLOR=#009900]][/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
    [COLOR=#000088]$country[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#000088]$_POST[/COLOR][COLOR=#009900][[/COLOR][COLOR=#0000FF]'country'[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#000088]$country[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#990000]htmlspecialchars[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$country[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#000088]$country[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#990000]strip_tags[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$country[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
         
    [COLOR=#000088]$age[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#000088]$_POST[/COLOR][COLOR=#009900][[/COLOR][COLOR=#0000FF]'age'[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#000088]$age[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#990000]htmlspecialchars[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$age[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#000088]$age[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#990000]strip_tags[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000088]$age[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
         
    [COLOR=#B1B100]echo[/COLOR] [COLOR=#0000FF]"country : "[/COLOR][COLOR=#339933].[/COLOR][COLOR=#000088]$country[/COLOR][COLOR=#339933].[/COLOR][COLOR=#0000FF]" --- age : "[/COLOR][COLOR=#339933].[/COLOR][COLOR=#000088]$age[/COLOR][COLOR=#339933].[/COLOR][COLOR=#0000FF]""[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR]
[B]?>[/B][/FONT]
[/FONT][/COLOR]
بنابراین کدهای PHP صفحه، ابتدا چک می کنند که مقادیری برای دو متغیر country و age ، با روش POST ، به صفحه ارسال شده باشد (اگر ارسال نشده باشد، هیچ کد دیگری اجرا نمی شود و خروجی به صورت صفحه خالی خواهد بود). سپس در صورتی که برای هر دو متغیر، مقدار به صفحه ارسال شده باشد، مقادیر دریافت شده و در دو متغیر با همان نام ها، ذخیره می شود. سپس یک عبارت که در آن، مقدار متغیرها نیز وجود دارد، در خروجی چاپ می شود.

اگر در کدها دقت کنید، دو تابع htmlspecialchars و strip_tags را بر روی مقادیر دریافت شده، اعمال کرده ایم. این عمل برای ایجاد امنیت بیشتر است زیرا ممکن است که یک کاربر، به عنوان هکر، تعدادی کد مخرب را در میان ورودی ها قرار بدهد. در این مورد، در مبحثی دیگر صحبت خواهیم کرد، اما بد نیست به طور مختصر بگوییم که تابع htmlspecialchars ، باعث می شود که هنگام چاپ یک عبارت در خروجی صفحه، اگر تگ های (tags) مربوط به HTML در آن عبارت وجود دارند، به جای اجرا شدن به عنوان کد، تنها در خروجی نمایش داده شوند. همچنین تابع strip_tags ، برای حذف تگ های HTML و PHP موجود در یک عبارت به کار می رود. اگر در آینده بخش های امنیتی بیشتری به این کدها اضافه کنیم، شما مطمئن باشید که در خروجی صفحات تاثیری نخواهد داشت و با اطمینان می توانید از این صفحات استفاده کنید (همان طور که گفتیم، آدرس URL آنها همیشه ثابت خواهد بود و عملکرد آنها تغییری نخواهد کرد و فقط ممکن است صلاح بدانیم که بخشی از کدهای امنیتی را در اینجا نمایش ندهیم).

برای تعیین مقدار برای متغیرها (به روش POST)، باید به مباحث مربوط به فرم ها در PHP مراجعه کنید که در آن مباحث، با چگونگی ارسال مقدار برای متغیرها، به یک صفحه اینترنتی، آشنا می شوید، ولی فعلا ما کاری با آن نداریم و تنها می خواهیم به چگونگی ارسال توسط برنامه اندروید، آشنا بشویم. فقط بد نیست این را بدانید که در روش GET ، مقادیر را در آدرس URL می نوشتیم اما در روش POST ، مقادیر توسط یک فرم که دارای دکمه submit است، ارسال می شوند (این نکات در مباحث طراحی سایت شرح داده می شوند). بنابراین قبلا که از HttpGet استفاده می کردیم، تنها کافی بود که مقادیر را در رشته ای (string) که حاوی آدرس URL صفحه اینترنتی بود، بنویسیم، ولی اکنون که می خواهیم از HttpPost استفاده کنیم، باید برای هر کدام از مقادیر (مقادیر در نظر گرفته شده برای متغیرها) یک پارامتر تعریف کنیم.

اگر برای صفحه مورد نظر، برای متغیر country ، مقدار iran و برای متغیر age ، مقدار 27 را با روش POST ارسال کنیم، خروجی به صورت زیر خواهد بود (چگونگی آن را شرح نمی دهم زیرا مربوط به مبحث فرم ها در طراحی سایت است و ممکن است باعث گیجی شما شود) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]country : iran --- age : 27[/FONT]
[/FONT][/COLOR]
استفاده از مرورگر اینترنت، تنها برای آزمایش عملکرد صفحه می باشد، اما می خواهیم در برنامه اندروید خود، از کدهایی استفاده کنیم که همین دو مقدار را برای دو متغیر، به صفحه ارسال کند و سپس نتیجه را از صفحه دریافت کرده و در یک TextView به ما نمایش بدهد.

قبل از هر چیز، باید به برنامه اندروید خود، اجازه دسترسی به اینترنت را بدهیم. برای این منظور، باید کد زیر را به کدهای فایل AndroidManifest.xml پروژه اندروید، اضافه کنیم:
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
علاوه بر این، بخشی از کدها نیز برای چک کردن اتصال به اینترنت می باشد و برای آنها، باید اجازه دسترسی زیر نیز به فایل AndroidManifest.xml افزوده شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.ACCESS_NETWORK_STATE"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
فرض کنید که نام package پروژه اندروید، برابر com.kelidestan.httppost و نام activity اصلی آن برابر MainActivity.java و نام فایل xml متناظر با activity اصلی برابر activity_main.xml باشد.

با توجه به فرض هایی که بیان کردیم، کدهای فایل AndroidManifest.xml ، به صورت زیر خواهد بود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]manifest xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    [B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.httppost"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionCode[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionName[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]sdk
        android[COLOR=#339933]:[/COLOR]minSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"8"[/COLOR] [COLOR=#339933]/>[/COLOR]
    
    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR]
    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.ACCESS_NETWORK_STATE"[/COLOR] [COLOR=#339933]/>[/COLOR]

    [COLOR=#339933]<[/COLOR]application
        android[COLOR=#339933]:[/COLOR]allowBackup[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR]
        android[COLOR=#339933]:[/COLOR]icon[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR]
        android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR]
        android[COLOR=#339933]:[/COLOR]theme[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@style/AppTheme"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.httppost.MainActivity"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR] [COLOR=#339933]>[/COLOR]
            [COLOR=#339933]<[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
                [COLOR=#339933]<[/COLOR]action android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.action.MAIN"[/COLOR] [COLOR=#339933]/>[/COLOR]

                [COLOR=#339933]<[/COLOR]category android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.category.LAUNCHER"[/COLOR] [COLOR=#339933]/>[/COLOR]
            [COLOR=#339933]</[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]</[/COLOR]application[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]manifest[COLOR=#339933]>[/COLOR]
[/FONT]
[/FONT][/COLOR]
همچنین کدهای فایل activity_main.xml به صورت زیر می باشد (در آن یک TextView تعریف کرده ایم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]RelativeLayout xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    xmlns[COLOR=#339933]:[/COLOR]tools[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/tools"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingBottom[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_vertical_margin"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingLeft[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_horizontal_margin"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingRight[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_horizontal_margin"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingTop[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@dimen/activity_vertical_margin"[/COLOR]
    tools[COLOR=#339933]:[/COLOR]context[COLOR=#339933]=[/COLOR][COLOR=#0000FF]".MainActivity"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]TextView
        android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@+id/textView1"[/COLOR]
        android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"wrap_content"[/COLOR]
        android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"wrap_content"[/COLOR] [COLOR=#339933]/>[/COLOR]

[COLOR=#339933]</[/COLOR]RelativeLayout[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
و کدهای فایل MainActivity.java که همان activity اصلی پروژه اندروید است را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.httppost[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]java.io.BufferedReader[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.IOException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.InputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.InputStreamReader[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.UnsupportedEncodingException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.HttpURLConnection[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.MalformedURLException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.net.URL[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.ArrayList[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.util.List[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]org.apache.http.HttpEntity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.HttpResponse[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.NameValuePair[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.client.ClientProtocolException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.client.entity.UrlEncodedFormEntity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.client.methods.HttpGet[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.client.methods.HttpPost[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.impl.client.DefaultHttpClient[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.message.BasicNameValuePair[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.app.ProgressDialog[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.Context[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.net.ConnectivityManager[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.net.NetworkInfo[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.AsyncTask[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.util.Log[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.TextView[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.Toast[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                [B]new[/B] NetCheck[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

        [COLOR=#008000][B][I]/**
         * Async Task to check whether internet connection is working.
         **/[/I][/B][/COLOR]

            [B]private[/B] [B]class[/B] NetCheck [B]extends[/B] AsyncTask[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR],[COLOR=#003399]String[/COLOR],Boolean[COLOR=#339933]>[/COLOR]
            [COLOR=#009900]{[/COLOR]
                [B]private[/B] ProgressDialog nDialog[COLOR=#339933];[/COLOR]

                @Override
                [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPreExecute[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                    [B]super[/B].[COLOR=#006633]onPreExecute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog [COLOR=#339933]=[/COLOR] [B]new[/B] ProgressDialog[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setTitle[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Checking Network"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Loading.."[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setIndeterminate[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]setCancelable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    nDialog.[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR]
                [COLOR=#008000][B][I]/**
                 * Gets current device state and checks for working internet connection by trying Google.
                **/[/I][/B][/COLOR]
                @Override
                [B]protected[/B] [COLOR=#003399]Boolean[/COLOR] doInBackground[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR]... [COLOR=#006633]args[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]

                    ConnectivityManager cm [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ConnectivityManager[COLOR=#009900])[/COLOR]getSystemService[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR].[COLOR=#006633]CONNECTIVITY_SERVICE[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    NetworkInfo netInfo [COLOR=#339933]=[/COLOR] cm.[COLOR=#006633]getActiveNetworkInfo[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [B]if[/B] [COLOR=#009900]([/COLOR]netInfo [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR] [COLOR=#339933]&&[/COLOR] netInfo.[COLOR=#006633]isConnected[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        [B]try[/B] [COLOR=#009900]{[/COLOR]
                            [COLOR=#003399]URL[/COLOR] url [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]URL[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"http://www.google.com"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            [COLOR=#003399]HttpURLConnection[/COLOR] urlc [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#003399]HttpURLConnection[/COLOR][COLOR=#009900])[/COLOR] url.[COLOR=#006633]openConnection[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            urlc.[COLOR=#006633]setConnectTimeout[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]3000[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            urlc.[COLOR=#006633]connect[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            [B]if[/B] [COLOR=#009900]([/COLOR]urlc.[COLOR=#006633]getResponseCode[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]==[/COLOR] [COLOR=#CC66CC]200[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                                [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
                            [COLOR=#009900]}[/COLOR]
                        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]MalformedURLException[/COLOR] e1[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                            [COLOR=#666666][I]// TODO Auto-generated catch block[/I][/COLOR]
                            e1.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                            [COLOR=#666666][I]// TODO Auto-generated catch block[/I][/COLOR]
                            e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                    [B]return[/B] [COLOR=#000066][B]false[/B][/COLOR][COLOR=#339933];[/COLOR]

                [COLOR=#009900]}[/COLOR]
                @Override
                [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPostExecute[COLOR=#009900]([/COLOR][COLOR=#003399]Boolean[/COLOR] th[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]

                    [B]if[/B][COLOR=#009900]([/COLOR]th [COLOR=#339933]==[/COLOR] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                        nDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [B]new[/B] GetData[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                    [B]else[/B][COLOR=#009900]{[/COLOR]
                        nDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]getApplicationContext[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"Error in Network Connection"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                [COLOR=#009900]}[/COLOR]
            [COLOR=#009900]}[/COLOR]
            
            
            [COLOR=#008000][B][I]/**
             * Async Task to get data from URL
             **/[/I][/B][/COLOR]
            [B]private[/B] [B]class[/B] GetData [B]extends[/B] AsyncTask[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], [COLOR=#003399]String[/COLOR], String[COLOR=#339933]>[/COLOR] [COLOR=#009900]{[/COLOR]

                [B]private[/B] ProgressDialog pDialog[COLOR=#339933];[/COLOR]
                [B]private[/B] [COLOR=#003399]InputStream[/COLOR] is [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
                [B]private[/B] [COLOR=#003399]String[/COLOR] url [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"http://www.kelidestan.com/fixed-url/kelidestan-2.php"[/COLOR][COLOR=#339933];[/COLOR]
                [B]private[/B] [COLOR=#003399]String[/COLOR] page_output [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]""[/COLOR][COLOR=#339933];[/COLOR]

                @Override
                [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPreExecute[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                    [B]super[/B].[COLOR=#006633]onPreExecute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                    pDialog [COLOR=#339933]=[/COLOR] [B]new[/B] ProgressDialog[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    pDialog.[COLOR=#006633]setTitle[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Contacting Servers"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    pDialog.[COLOR=#006633]setMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Logging in ..."[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    pDialog.[COLOR=#006633]setIndeterminate[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    pDialog.[COLOR=#006633]setCancelable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    pDialog.[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR]

                @Override
                [B]protected[/B] [COLOR=#003399]String[/COLOR] doInBackground[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR]... [COLOR=#006633]args[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]

                        [B]try[/B] [COLOR=#009900]{[/COLOR]
                                [COLOR=#666666][I]// Building Parameters[/I][/COLOR]
                        List[COLOR=#339933]<[/COLOR]NameValuePair[COLOR=#339933]>[/COLOR] params [COLOR=#339933]=[/COLOR] [B]new[/B] ArrayList[COLOR=#339933]<[/COLOR]NameValuePair[COLOR=#339933]>[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        params.[COLOR=#006633]add[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] BasicNameValuePair[COLOR=#009900]([/COLOR][COLOR=#0000FF]"country"[/COLOR], [COLOR=#0000FF]"iran"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        params.[COLOR=#006633]add[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] BasicNameValuePair[COLOR=#009900]([/COLOR][COLOR=#0000FF]"age"[/COLOR], [COLOR=#0000FF]"27"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#666666][I]// defaultHttpClient[/I][/COLOR]
                        DefaultHttpClient httpClient [COLOR=#339933]=[/COLOR] [B]new[/B] DefaultHttpClient[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        HttpPost httpPost [COLOR=#339933]=[/COLOR] [B]new[/B] HttpPost[COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        httpPost.[COLOR=#006633]setEntity[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] UrlEncodedFormEntity[COLOR=#009900]([/COLOR]params[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                        HttpResponse httpResponse [COLOR=#339933]=[/COLOR] httpClient.[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR]httpPost[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        HttpEntity httpEntity [COLOR=#339933]=[/COLOR] httpResponse.[COLOR=#006633]getEntity[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        is [COLOR=#339933]=[/COLOR] httpEntity.[COLOR=#006633]getContent[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]UnsupportedEncodingException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR]ClientProtocolException e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                    [B]try[/B] [COLOR=#009900]{[/COLOR]
                        [COLOR=#003399]BufferedReader[/COLOR] reader [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]BufferedReader[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] [COLOR=#003399]InputStreamReader[/COLOR][COLOR=#009900]([/COLOR]
                                is, [COLOR=#0000FF]"iso-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#CC66CC]8[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        StringBuilder sb [COLOR=#339933]=[/COLOR] [B]new[/B] StringBuilder[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#003399]String[/COLOR] line [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
                        [B]while[/B] [COLOR=#009900]([/COLOR][COLOR=#009900]([/COLOR]line [COLOR=#339933]=[/COLOR] reader.[COLOR=#006633]readLine[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                            sb.[COLOR=#006633]append[/COLOR][COLOR=#009900]([/COLOR]line [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]"[COLOR=#000099][B]\n[/B][/COLOR]"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR]
                        is.[COLOR=#006633]close[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        page_output [COLOR=#339933]=[/COLOR] sb.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        Log.[COLOR=#006633]e[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Buffer Error"[/COLOR], [COLOR=#0000FF]"Error converting result "[/COLOR] [COLOR=#339933]+[/COLOR] e.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                    
                    [B]return[/B] page_output[COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR]

                @Override
                [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onPostExecute[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] page_output[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        pDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [B]try[/B] [COLOR=#009900]{[/COLOR]
                        [COLOR=#666666][I]// display output of internet page (page_output string)[/I][/COLOR]
                        TextView tv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TextView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        tv.[COLOR=#006633]setText[/COLOR][COLOR=#009900]([/COLOR]page_output[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
               [COLOR=#009900]}[/COLOR]
            [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اگر در کدها دقت کنید، دو بار از AsyncTask استفاده کرده ایم. در واقع، دو کلاس (class) تعریف کرده ایم که هر کدام به صورت AsyncTask می باشند. AsyncTask به این صورت است که ابتدا یک ProgressDialog به شما نمایش داده می شود تا بدانید که یک سری فرآیند (کد) در حال اجرا شدن می باشد، سپس پس از پایان اجرای کدها، آن ProgressDialog ناپدید شده و نتیجه به شما نمایش داده می شود (یا هر مورد دیگر). استفاده از AsyncTask بسیار مهم می باشد زیرا همیشه باید کدهایی را که نمی دانیم اجرای آنها چه مدت طول می کشد را با AsyncTask اجرا کنیم.

کلاس اول دارای نام NetCheck می باشد و برای چک کردن اتصال به اینترنت به کار می رود. سپس اگر گوشی کاربر به اینترنت متصل باشد، کلاس دوم که دارای نام GetData است، فراخوانی می شود. اگر به کدهای روش onCreate دقت کنید، ابتدا با کد زیر، کلاس NetCheck را اجرا می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]new[/B] NetCheck[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
کلاس NetCheck ، وضعیت اتصال به اینترنت را چک می کند و اگر گوشی کاربر به اینترنت متصل باشد، آنگاه کلاس GetData را اجرا خواهد کرد که برای دریافت اطلاعات از آدرس اینترنتی می باشد.

به کدهای زیر دقت کنید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]                    [B]try[/B] [COLOR=#009900]{[/COLOR]
                                [COLOR=#666666][I]// Building Parameters[/I][/COLOR]
                        List[COLOR=#339933]<[/COLOR]NameValuePair[COLOR=#339933]>[/COLOR] params [COLOR=#339933]=[/COLOR] [B]new[/B] ArrayList[COLOR=#339933]<[/COLOR]NameValuePair[COLOR=#339933]>[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        params.[COLOR=#006633]add[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] BasicNameValuePair[COLOR=#009900]([/COLOR][COLOR=#0000FF]"country"[/COLOR], [COLOR=#0000FF]"iran"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        params.[COLOR=#006633]add[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] BasicNameValuePair[COLOR=#009900]([/COLOR][COLOR=#0000FF]"age"[/COLOR], [COLOR=#0000FF]"27"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#666666][I]// defaultHttpClient[/I][/COLOR]
                        DefaultHttpClient httpClient [COLOR=#339933]=[/COLOR] [B]new[/B] DefaultHttpClient[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        HttpPost httpPost [COLOR=#339933]=[/COLOR] [B]new[/B] HttpPost[COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        httpPost.[COLOR=#006633]setEntity[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] UrlEncodedFormEntity[COLOR=#009900]([/COLOR]params[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                        HttpResponse httpResponse [COLOR=#339933]=[/COLOR] httpClient.[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR]httpPost[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        HttpEntity httpEntity [COLOR=#339933]=[/COLOR] httpResponse.[COLOR=#006633]getEntity[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        is [COLOR=#339933]=[/COLOR] httpEntity.[COLOR=#006633]getContent[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]UnsupportedEncodingException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR]ClientProtocolException e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                    [B]try[/B] [COLOR=#009900]{[/COLOR]
                        [COLOR=#003399]BufferedReader[/COLOR] reader [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]BufferedReader[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] [COLOR=#003399]InputStreamReader[/COLOR][COLOR=#009900]([/COLOR]
                                is, [COLOR=#0000FF]"iso-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#CC66CC]8[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        StringBuilder sb [COLOR=#339933]=[/COLOR] [B]new[/B] StringBuilder[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#003399]String[/COLOR] line [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
                        [B]while[/B] [COLOR=#009900]([/COLOR][COLOR=#009900]([/COLOR]line [COLOR=#339933]=[/COLOR] reader.[COLOR=#006633]readLine[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                            sb.[COLOR=#006633]append[/COLOR][COLOR=#009900]([/COLOR]line [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]"[COLOR=#000099][B]\n[/B][/COLOR]"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR]
                        is.[COLOR=#006633]close[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        page_output [COLOR=#339933]=[/COLOR] sb.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        Log.[COLOR=#006633]e[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Buffer Error"[/COLOR], [COLOR=#0000FF]"Error converting result "[/COLOR] [COLOR=#339933]+[/COLOR] e.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
در کدهای فوق، متغیر url به صورت رشته (string) می باشد که آدرس URL صفحه اینترنتی در آن ذخیره شده است. با استفاده از httpPost ، اطلاعات را از صفحه اینترنتی دریافت کرده ایم و سپس خروجی صفحه در یک رشته با نام page_output ذخیره می شود (که بعدا آن را در TextView نمایش خواهیم داد).

اگر برنامه را بر روی یک گوشی واقعی نصب کنیم، نتیجه به صورت زیر خواهد بود (البته قبل از نمایش نتیجه، دو بار، ProgressDialog نمایش داده می شود) :

android-228.jpg

فایل های پروژه اندروید را می توانید از لینک های زیر دریافت کنید :
.
 

پیوست ها

  • 114.rar
    260.3 کیلوبایت · بازدیدها: 0
  • 113.zip
    932.3 کیلوبایت · بازدیدها: 0

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
ارسال صحیح متن های فارسی، با روش های HttpPost و HttpGet ، در برنامه نویسی اندروید

ارسال صحیح متن های فارسی، با روش های HttpPost و HttpGet ، در برنامه نویسی اندروید

معمولا ممکن است که کدهای مربوط به روش های HttpPost و HttpGet ، برای ارسال متن های انگلیسی به سرور اینترنتی، درست عمل کنند اما زمانی که یک متن فارسی را با آنها به سرور ارسال نمایید، مشاهده می کنید که در طرف سرور، تمامی حروف متن فارسی، به شکل علامت سوال (?) در آمده اند. برای جلوگیری از این مشکل، باید UTF-8 را برای پردازش کاراکترها انتخاب کنیم.

فرض کنید که کدهای مربوط به روش HttpPost را به صورت زیر نوشته ایم (تنها بخشی از کدها را ذکر کرده ایم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]HttpPost httpPost [COLOR=#339933]=[/COLOR] [B]new[/B] HttpPost[COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
httpPost.[COLOR=#006633]setEntity[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] UrlEncodedFormEntity[COLOR=#009900]([/COLOR]params[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
که در آن، url ، رشته ای (String) است که آدرس اینترنتی صفحه مورد نظرمان در آن ذخیره شده است. با این شیوه کدنویسی، متن های انگلیسی به درستی ارسال می شوند، اما برای متن های فارسی، درست عمل نمی کند.

به خط زیر از کدها توجه کنید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]httpPost.[COLOR=#006633]setEntity[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] UrlEncodedFormEntity[COLOR=#009900]([/COLOR]params[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
برای اینکه متن های فارسی به درستی ارسال شوند، باید آن را به صورت زیر تغییر بدهیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]httpPost.[COLOR=#006633]setEntity[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] UrlEncodedFormEntity[COLOR=#009900]([/COLOR]params,[COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
برای روش HttpGet نیز باید مشابه روش HttpPost عمل کنیم. یعنی بخشی مشابه (هنگام استفاده از setEntity) از کدهای آن را نیز به همین صورت (با افزودن عبارت UTF-8) تغییر بدهیم.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تبدیل یک رشته (string) به یک JSONObject و توضیح در مورد کلاس های json parser مورد استفاده توسط برنامه نویس های اندروید

تبدیل یک رشته (string) به یک JSONObject و توضیح در مورد کلاس های json parser مورد استفاده توسط برنامه نویس های اندروید

هنگامی که می خواهیم پاسخ یک صفحه اینترنتی (یک آدرس URL) را به دست آوریم، از HttpGet یا HttpPost استفاده می کنیم، که HttpGet از روش GET برای ارسال اطلاعات به آن صفحه اینترنتی استفاده می کند و روش HttpPost با استفاده از روش POST ، اطلاعات را به صفحه اینترنتی می فرستد و سپس پاسخ را دریافت می کنند. معمولا پاسخ حاصل را در یک رشته (string) ذخیره می کنیم. اگر ساختار پاسخ صفحه اینترنتی، به صورت JSON باشد، برای خواندن اطلاعات مورد نظرمان از آن، باید رشته (string) حاصل از پاسخ صفحه اینترنتی را به یک JSONObject تبدیل کنیم.

با فرض اینکه رشته دارای نام myString باشد، برای تبدیل آن به یک JSONObject ، کد زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]JSONObject jObj [COLOR=#339933]=[/COLOR] [B]new[/B] JSONObject[COLOR=#009900]([/COLOR]myString[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
[h=4]نکته :[/h]شاید در اینترنت، کلاس های (class) آماده ای تحت عنوان json parser را دیده باشید که از آنها برای خواندن اطلاعات از صفحات اینترنتی استفاده می شود که پاسخ آن صفحات اینترنتی، دارای ساختار JSON می باشد. بد نیست این نکته را بدانید که ساختار کدهای آن کلاس ها، به این صورت است که ابتدا کدهایی برای دریافت پاسخ صفحه اینترنتی (یک URL)، توسط روش HttpGet یا HttpPost را اجرا می کنند و سپس پاسخ را در یک رشته (string) ذخیره نموده و در نهایت، آن رشته را به یک JSONObject تبدیل نموده و بر می گردانند. بنابراین کاربر با استفاده از آن کلاس ها، پاسخ صفحه را به صورت یک JSONObject به دست می آورد تا بتواند اطلاعات مورد نظر خود را از آن استخراج کند. دقت شود که در این موارد، باید پاسخ صفحه اینترنتی، دارای ساختار JSON باشد.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تبدیل یک JSONObject به یک رشته (String)، در برنامه نویسی اندروید

تبدیل یک JSONObject به یک رشته (String)، در برنامه نویسی اندروید

فرض کنید که یک JSONObject با نام myJSONObject داریم و می خواهیم که آن را به یک رشته (String) تبدیل کنیم، برای این منظور، کد زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] str [COLOR=#339933]=[/COLOR] myJSONObject.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
بر طرف کردن مشکل وجود فضای خالی در آدرس URL ، هنگام استفاده از HttpGet ، در برنامه نویسی اندروید

بر طرف کردن مشکل وجود فضای خالی در آدرس URL ، هنگام استفاده از HttpGet ، در برنامه نویسی اندروید

همان طور که می دانید، از HttpGet برای ارسال اطلاعات به یک صفحه اینترنت (یک صفحه از سرور) استفاده می شود و این ارسال اطلاعات، با روش GET می باشد. ویژگی روش GET این است که مقدار متغیری که در حال ارسال آن هستیم، در آدرس URL آن صفحه، نمایش داده می شود. مشکلی که از این بابت ممکن است به وجود بیاید، امکان بودن یک یا چند کاراکتر غیر مجاز برای URL ها، در مقدار متغیر می باشد که عملا باعث می شود که نتوانیم به صفحه مورد نظرمان ارتباظ برقرار کنیم (زیرا یک URL غلط ساخته می شود و بنابراین سرور آن را نمی پذیرد). مثلا فرض کنید که در مقدار مربوط به متغیرمان، یک فضای خالی (space) موجود باشد، بنابراین URL ای که ساخته می شود، غلط خواهد بود. برای جلوگیری از این مشکل، راه حلی در برنامه نویسی اندروید در نظر گرفته شده است که در ادامه آن را شرح می دهیم.

ابتدا کد زیر را در نظر بگیرید که در آن از HttpGet برای اتصال به یک صفحه از اینترنت (سرور مورد نظرمان) استفاده کرده ایم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]HttpClient httpclient [COLOR=#339933]=[/COLOR] [B]new[/B] DefaultHttpClient[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#003399]String[/COLOR] variable_value [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"[/COLOR][COLOR=#0000FF]iran-eng[/COLOR][COLOR=#0000FF]"[/COLOR][COLOR=#339933];[/COLOR]
HttpGet httpget [COLOR=#339933]=[/COLOR] [B]new[/B] HttpGet[COLOR=#009900]([/COLOR][COLOR=#0000FF]"http://www.www.www.iran-eng.ir/index.php?variable_name="[/COLOR] 
                                [COLOR=#339933]+[/COLOR] variable_value[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] 
[B]try[/B] [COLOR=#009900]{[/COLOR]
    HttpResponse response [COLOR=#339933]=[/COLOR] httpclient.[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR]httpget[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [B]if[/B][COLOR=#009900]([/COLOR]response [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [COLOR=#666666][I]// some code[/I][/COLOR]
    [COLOR=#009900]}[/COLOR] [B]else[/B] [COLOR=#009900]{[/COLOR]
        Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR][B]this[/B], [COLOR=#0000FF]"Unable to complete your request"[/COLOR], Toast.[COLOR=#006633]LENGTH_LONG[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR]ClientProtocolException e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR][B]this[/B], [COLOR=#0000FF]"Caught ClientProtocolException"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR][B]this[/B], [COLOR=#0000FF]"Caught IOException"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR][B]this[/B], [COLOR=#0000FF]"Caught Exception"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
کد بالا، مقدار iran-eng را به عنوان مقدار متغیری با نام variable_name به صفحه اینترنتی زیر ارسال می کند (این یک فرض است و به اینکه آیا صفحه برای دریافت مقدار این متغیر طراحی شده یا نه، کاری نداریم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http://www.www.www.iran-eng.ir/index.php[/FONT]
[/FONT][/COLOR]
یعنی آدرس URL به صورت زیر خواهد بود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http://www.www.www.iran-eng.ir/index.php?variable_name=iran-eng[/FONT]
[/FONT][/COLOR]
اما اکنون فرض کنید که به جای خط زیر از کدها :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] variable_value [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"iran-eng"[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
کد زیر را بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] variable_value [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"[/COLOR][COLOR=#0000FF]iran-eng [/COLOR][COLOR=#0000FF]site"[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
همان طور که مشاهده می کنید، یک فضای خالی (space) در مقدار متغیر وجود دارد که باعث می شود URL صفحه به صورت زیر نوشته شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http://www.www.www.iran-eng.ir/index.php?variable_name=iran-eng site[/FONT]
[/FONT][/COLOR]
این URL ، غلط است و باعث می شود که نتوانیم مقدار مورد نظرمان را به آن صفحه ارسال کنیم. برای رفع این مشکل، کدها را به صورت زیر تغییر می دهیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]HttpClient httpclient [COLOR=#339933]=[/COLOR] [B]new[/B] DefaultHttpClient[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#003399]String[/COLOR] variable_value [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"iran-eng site"[/COLOR][COLOR=#339933];[/COLOR]
variable_value [COLOR=#339933]=[/COLOR] [COLOR=#003399]URLEncoder[/COLOR].[COLOR=#006633]encode[/COLOR][COLOR=#009900]([/COLOR]variable_value, [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
HttpGet httpget [COLOR=#339933]=[/COLOR] [B]new[/B] HttpGet[COLOR=#009900]([/COLOR][COLOR=#0000FF]"http://www.[/COLOR][COLOR=#0000FF]iran-eng[/COLOR][COLOR=#0000FF].com/index.php?variable_name="[/COLOR] 
                                [COLOR=#339933]+[/COLOR] variable_value[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] 
[B]try[/B] [COLOR=#009900]{[/COLOR]
    HttpResponse response [COLOR=#339933]=[/COLOR] httpclient.[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR]httpget[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [B]if[/B][COLOR=#009900]([/COLOR]response [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [COLOR=#666666][I]// some code[/I][/COLOR]
    [COLOR=#009900]}[/COLOR] [B]else[/B] [COLOR=#009900]{[/COLOR]
        Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR][B]this[/B], [COLOR=#0000FF]"Unable to complete your request"[/COLOR], Toast.[COLOR=#006633]LENGTH_LONG[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR]ClientProtocolException e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR][B]this[/B], [COLOR=#0000FF]"Caught ClientProtocolException"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR][B]this[/B], [COLOR=#0000FF]"Caught IOException"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR][B]this[/B], [COLOR=#0000FF]"Caught Exception"[/COLOR], Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
که در آن، تنها خط زیر به کدها افزوده شده است :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]variable_value [COLOR=#339933]=[/COLOR] [COLOR=#003399]URLEncoder[/COLOR].[COLOR=#006633]encode[/COLOR][COLOR=#009900]([/COLOR]variable_value, [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون مقدار iran-eng site به طور صحیح به صفحه مورد نظرمان ارسال خواهد شد زیرا مقدار متغیر(variable_value) را encode کرده ایم (به جای آن کاراکتر غیرمجاز، برخی کاراکترهای مجاز در آدرس URL قرار داده می شود، که البته نیازی به دانستن آنها نیست و افزودن همین کد، کافی است).

نکته :

نیاز به ایجاد تغییر در صفحه اینترنتی (صفحه موجود در سرور) نیست و encode کردن مقدار متغیرها در کدهای برنامه اندروید، کافی است.

نکته مهم :

همان طور که در کدهای قبل مشاهده کردید، تنها باید مقدار متغیرها را encode کنیم، نه کل آدرس URL . اگر کل آدرس URL را encode کنیم، با خطا روبرو می شویم. این نکته اهمیت زیادی دارد و ممکن است برنامه نویس به اشتباه کل URL را encode کند.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
عدم استفاده از چارچوب HTML هنگام ساخت صفحه ای بر روی سرور، برای دریافت اطلاعات آن صفحه توسط برنامه اندروید با روش JSON

عدم استفاده از چارچوب HTML هنگام ساخت صفحه ای بر روی سرور، برای دریافت اطلاعات آن صفحه توسط برنامه اندروید با روش JSON

معمولا افرادی که برای برنامه اندروید خود، یک سری خدمات سرور نیز طراحی می کنند، تجربه هایی در زمینه طراحی سایت نیز دارند. این افراد، ابتدا صفحه طراحی شده (اطلاعات به صورت JSON) را در مرورگر اینترنت مشاهده می کنند تا از خروجی مناسب آن اطمینان حاصل کنند. یک اشتباه رایج که ممکن است در این هنگام رخ دهد، استفاده از چارچوب کدنویسی HTML است. ممکن است فرد اطلاعات خود را در چارچوب HTML قرار دهد، اما باید به این نکته توجه داشت که اگرچه مرورگر اینترنت این چارچوب ها را در خروجی نمایش نمی دهد، ولی برنامه اندروید هنگام دریافت کدهای چارچوب HTML ، آنها را به عنوان اطلاعات دریافتی به صورت JSON در نظر می گیرد و همین مورد، باعث ایجاد خطا در اجرای برنامه می شود (برنامه با force close مواجه خواهد شد).

بنابراین فراموش نکنید که هنگام ساخت اطلاعات به روش JSON ، هرگز از چارچوب HTML استفاده نکنید.

منظور از چارچوب HTML ، کدهایی مشابه ساختار کلی زیر است که صفحات اینترنتی با آن ساخته و نمایش داده می شوند :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<![/COLOR]DOCTYPE html [B]PUBLIC[/B] [COLOR=#0000FF]"-//W3C//DTD XHTML 1.0 Transitional//EN"[/COLOR][COLOR=#0000FF]"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"[/COLOR][COLOR=#339933]>[/COLOR]
[COLOR=#339933]<[/COLOR]html xmlns[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://www.w3.org/1999/xhtml"[/COLOR][COLOR=#339933]>[/COLOR]
[COLOR=#339933]<[/COLOR]head[COLOR=#339933]>[/COLOR]
[COLOR=#339933]<[/COLOR]meta http[COLOR=#339933]-[/COLOR]equiv[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"Content-Type"[/COLOR] content[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"text/html; charset=utf-8"[/COLOR] [COLOR=#339933]/>[/COLOR]
[COLOR=#339933]<[/COLOR]title[COLOR=#339933]>[/COLOR]Untitled Document[COLOR=#339933]</[/COLOR]title[COLOR=#339933]>[/COLOR]
[COLOR=#339933]</[/COLOR]head[COLOR=#339933]>[/COLOR]

[COLOR=#339933]<[/COLOR]body[COLOR=#339933]>[/COLOR]
[COLOR=#339933]</[/COLOR]body[COLOR=#339933]>[/COLOR]
[COLOR=#339933]</[/COLOR]html[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
نمایش صحیح متن های فارسی دریافت شده با روش JSON از سرور، در برنامه نویسی اندروید

نمایش صحیح متن های فارسی دریافت شده با روش JSON از سرور، در برنامه نویسی اندروید

فرض کنید که اطلاعاتی را با روش JSON از سرور مورد نظرمان دریافت کرده ایم و آنها را در یک JSONObject با نام jsonObject_1 ذخیره کرده ایم. روش معمولی برای دریافت حروف انگلیسی، به صورت زیر می باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] my_string_1 [COLOR=#339933]=[/COLOR] jsonObject_1.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"name_1"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اما این روش برای حروف فارسی درست عمل نمی کند و باعث نمایش یک سری عبارت های بی معنی، در هنگام نمایش اطلاعات، می شود. دلیل آن، عدم انتخاب UTF-8 برای پردازش کاراکترها می باشد. بنابراین اگر در اطلاعات دریافتی از سرور، حروف فارسی نیز وجود دارد، باید کد قبل را به صورت زیر تغییر بدهیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] my_string_1 [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]jsonObject_1.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"name_1"[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون متن مورد نظرمان در رشته my_string_1 ذخیره شده و می توانیم آن را با روشی دلخواه نمایش بدهیم (دیگر اهمیتی ندارد که فارسی باشد یا انگلیسی و همه را به طور صحیح نمایش خواهد داد).

البته دقت شود که برای استفاده از این کد، باید یک try و catch ، به صورت زیر، برای آن در نظر بگیریم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]try[/B] [COLOR=#009900]{[/COLOR]
    [COLOR=#003399]String[/COLOR] my_string_1 [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]jsonObject_1.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"name_1"[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]UnsupportedEncodingException[/COLOR] e1[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    e1.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اگر در برنامه eclipse کد می نویسید، تنها کافی است که همان یک خط کد را نوشته و سپس کلیدهای Ctrl و 1 از کیبورد را فشار دهید، گزینه ای برای آن نمایش داده می شود و با کلیک بر روی آن گزینه، کدها به صورت try و catch در می آید.
 

P O U R I A

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

خواندن اطلاعات از یک JSONObject موجود در یک JSONObject دیگر، در برنامه نویسی اندروید

گاهی یک JSONObject ، خود شامل JSONObject دیگری است، بنابراین قصد داریم که در این مبحث شرح بدهیم که چگونه می توان از JSONObject ای که خود درون یک JSONObject دیگر قرار دارد، اطلاعات بخوانیم.

فرض کنید که پاسخ یک صفحه اینترنتی (آدرس URL) به صورت زیر باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]{ "info": "1", "city": {"shiraz": "10", "tehran": "11", "ghom": "12"} }[/FONT]
[/FONT][/COLOR]
بد نیست پاسخ فوق را به صورت زیر نمایش بدهیم تا ساختار آن را بهتر متوجه بشوید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]{ 
    "info": "1", 
    "city": {
                "shiraz": "10", 
                "tehran": "11", 
                "ghom": "12"
            } 
}[/FONT]
[/FONT][/COLOR]
زمانی که در برنامه اندروید، پاسخ فوق را از آدرس اینترنتی (یک URL) دریافت می کنیم، کل آن به صورت یک JSONObject خواهد بود. این JSONObject ، دارای یک گره با نام info است که مقدار 1 برای آن در نظر گرفته شده است. سپس یک JSONObject با نام city داریم که خود شامل 3 گره با نام های shiraz و tehran و ghom می باشد که برای هر یک، یک مقدار متناظر در نظر گرفته شده است (مثلا برای shiraz ، مقدار 10 در نظر گرفته شده).

فرض می کنیم که در برنامه اندروید، تا این مرحله کد نوشته ایم که پاسخ URL ، دریافت شده و آن را به صورت یک JSONObject در اختیار داشته باشیم. برای این کار، کلاس های (class) آماده در اینترنت پیدا می شود (json parser) و در اینجا قصد نداریم که در مورد آنها صحبت کنیم.

با فرض اینکه JSONObject دارای نام json باشد، چنانچه بخواهیم مقدار مربوط به info را در یک رشته (string) ذخیره کنیم، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] info_string [COLOR=#339933]=[/COLOR] json.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"info"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اگر در پاسخ آدرس اینترنتی (آدرس URL) نگاه کنید، مقدار info برابر 1 است، بنابراین رشته info_string برابر 1 خواهد بود.

اما همان طور که در ابتدای مبحث گفتیم، قصد داریم اطلاعات مربوط به JSONObject داخلی را فراخوانی کنیم. برای این منظور، ابتدا باید JSONObject داخلی در پاسخ را به صورت یک JSONObject مجزا در کدهای اندروید، ذخیره کنیم. برای این منظور، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]JSONObject json_city [COLOR=#339933]=[/COLOR] json.[COLOR=#006633]getJSONObject[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"city"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
همان طور که مشاهده می کنید، از JSONObject با نام json ، همان JSONObject داخلی که توسط کلمه city مشخص شده است را فراخوانی کرده ایم و سپس آن را به صورت یک JSONObject با نام json_city ذخیره کرده ایم.

اکنون فرض کنید که بخواهیم مقدار ذخیره شده برای shiraz را از JSONObject با نام json_city فراخوانی کرده و سپس در رشته ای با نام shiraz_string ذخیره کنیم، برای این منظور، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] shiraz_string [COLOR=#339933]=[/COLOR] json_city.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"shiraz"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین رشته shiraz_string دارای مقدار 10 خواهد بود.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
شرح چارچوب برنامه های اندروید با قابلیت تعامل با سرور اینترنتی (مثل برنامه های فروشگاه های اندروید، بازی های گروهی اینترنتی و ...)

شرح چارچوب برنامه های اندروید با قابلیت تعامل با سرور اینترنتی (مثل برنامه های فروشگاه های اندروید، بازی های گروهی اینترنتی و ...)

شرح چارچوب برنامه های اندروید با قابلیت تعامل با سرور اینترنتی (مثل برنامه های فروشگاه های اندروید، بازی های گروهی اینترنتی و ...) و توضیحاتی در مورد جزئیات ساخت یک فروشگاه اندروید :
حتما تاکنون برنامه های اندروید گوناگونی را دیده اید که بر اساس اطلاعات موجود در سرور اینترنتی عمل می کنند و همچنین یک طرفه هم نیستند و یک تعامل دو طرفه میان کاربران برنامه اندروید و سرور اینترنتی برقرار است (مثل برنامه های فروشگاه های اندروید، بازی های گروهی اینترنتی و ...). با توجه به درخواست تعدادی از کاربران، در این مبحث قصد داریم که چارچوب کلی اینگونه برنامه ها را شرح بدهیم. دقت کنید که هیچ کدی در این مبحث ارائه نخواهد شد، بلکه تنها راهنمایی می کنیم که اگر شخصی قصد ساخت برنامه ای مشابه این برنامه ها را دارد، باید به دنبال یادگیری چه مباحثی برود.


پیش نیاز ها (دامنه اینترنتی و هاست) :
برای اینکه برنامه اندروید شما، یک برنامه اینترنتی باشد، مسلما قبل از هر چیز، باید یک دامنه اینترنتی بخرید. منظور از دامنه اینترنتی، نام سایت ها است که در مرورگر اینترنت وارد می کنیم، مثلا :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]iran-eng.[COLOR=#006633]com[/COLOR][/FONT]
[/FONT][/COLOR]
بنده مقداری پول پرداخت کرده ام تا دامنه فوق، تا مدت مشخصی، متعلق به اینجانب باشد. اما علاوه بر این، شما باید یک کامپیوتر داشته باشید که فایل های مربوط به سایت خود را بر روی آن قرار بدهید و آن کامپیوتر هم باید به صورت شبانه روزی به اینترنت متصل باشد، مسلما قرار نیست خود ما چنین کامپیوتری داشته باشیم، بلکه شرکت هایی هستند که بخشی از امکانات سرورهای اینترنتی (کامپیوترهای بهینه شده برای اتصال به شبکه اینترنت) را در اختیار ما قرار می دهند و در ازای آن، مبلغی پول دریافت می کنند (که به آن، خرید هاست (host) می گوییم).


ساختار کلی :

ابتدا بگذارید برای شما بگویم که ساختار اینگونه برنامه ها بر چه اساس است. به شکل زیر دقت کنید :



496.jpg



مثلا اگر بخواهیم برنامه هایی در سه سیستم عامل اندروید (Android) و ios و windows phone ارائه کنیم، ساختار کلی به صورت زیر می باشد :
497.jpg

پایگاه داده (database) :

بر اساس شکل بالا، باید بگویم که مغز اینگونه برنامه ها، همان پایگاه داده (database) آنها می باشد. اطلاعات برنامه، در پایگاه داده ذخیره می شود. زمانی که یک برنامه نویس، برنامه خود را به طور کامل می سازد، دیگر تغییری در کدها به وجود نمی آورد، بلکه بر اساس نوع تعامل کاربران با برنامه، اطلاعات پایگاه داده تغییر داده می شود.

انواع مختلفی از پایگاه داده داریم که یک برنامه نویس می تواند آنها را انتخاب کند، مثلا من، پایگاه داده MySQL را انتخاب می کنم، زیرا هم کار کردن با آن ساده است و هم تعداد افراد استفاده کننده از آن زیاد می باشد (بنابراین، اگر به مشکلی در رابطه با آن برخورد کنید، در اینترنت، منابع زیادی برای یادگیری و یا راهنمایی خواستن از دیگران وجود دارد).


انواع سیستم عامل های نرم افزاری دلخواه (مثل اندروید (Android) و ios و windows phone و ...) :

منظور از سیستم عامل های نرم افزاری، نرم افزارهایی می باشد که شرکت های مختلف، برای تعامل کاربران با سخت افزارها می سازند. مثل اندروید (Android) و ios و windows phone و ... . ما در این مبحث قصد داریم که در مورد سیستم عامل نرم افزاری اندروید صحبت کنیم، اما دقت داشته باشید که خیلی از برنامه ها، برای چندین سیستم عامل نرم افزاری ارائه می شوند. یعنی واقعیت این است که ساخت پایگاه داده و همچنین طراحی زبان واسط، برای همه آن سیستم عامل ها یکسان است و برنامه نویس تنها باید خود برنامه سیستم عامل را برای کار با آنها طراحی کند، بنابراین خیلی از گروه های برنامه نویسی، برنامه خود را در چندین سیستم عامل نرم افزاری عرضه می کنند.

زبان برنامه نویسی واسط بین پایگاه داده (database) و برنامه ها در سیستم عامل های مختلف :

ما باید یک زبان برنامه نویسی را به عنوان واسط بین پایگاه داده و برنامه ها در سیستم عامل های مختلف مورد نظرمان انتخاب کنیم. این زبان، هم باید قابلیت کار با پایگاه داده را داشته باشد و هم توسط برنامه ها در سیستم عامل های مختلف، بتوانیم با آن تبادل اطلاعات داشته باشیم. به عنوان یک زبان واسط، می توان زبان برنامه نویسی PHP را نام برد (من آن را انتخاب می کنم).


انتخاب های ما برای ساختار کلی برنامه اندروید :


بنابراین پایگاه داده را برابر MySQL و زبان برنامه نویسی واسط را برابر زبان PHP انتخاب کردیم و سیستم عامل مورد نظرمان هم که همان اندروید (Android) می باشد، اکنون شکل مورد نظر، به صورت زیر در می آید :498.jpg
دقت شود که مثلا اگر قصد دارید که برنامه خود را برای سیستم عامل هایی مثل ios و windows phone نیز طراحی کنید، ساختار به صورت زیر می باشد (تنها تفاوت این است ک برای دو سیستم عامل دیگر نیز باید برنامه هایی برای کار با زبان واسط، یعنی PHP ، بنویسید) :499.jpg
خوب اکنون فرض می کنیم که برنامه اندرویدی که می خواهیم بسازیم، یک فروشگاه اندروید است. بنابراین جزئیات این مورد را در ادامه شرح می دهیم.

ساخت جدول ها (tables) در پایگاه داده MySQL :

اطلاعات مختلف، باید در جدول های (tables) جداگانه ای قرار بگیرند. مثلا جدول های مختلفی باید به صورت زیر ساخته شود :
1- اطلاعات مربوط به کاربران ثبت نام کرده در سایت
2- اطلاعات مربوط به توسعه دهندگان
3- اطلاعات مربوط به برنامه های آپلود شده برای بررسی
4- اطلاعات مربوط به برنامه های تایید شده و به فروش گذاشته شده
5- اطلاعات مربوط به فاکتورهای فروش
6- اطلاعات مربوط به نظرات کاربران در مورد برنامه های اندروید
و ...

ساخت این جدول ها می تواند با کد انجام شود و یا اینکه با واسط های گرافیکی مثل phpMyAdmin این کار را انجام بدهیم. انتخاب من، معمولا واسط های گرافیکی است زیرا همان لحظه می توانیم جدول ساخته شده را ببینیم.

کدنویسی PHP تعدادی صفحه php برای اتصال به پایگاه داده :

تعدادی صفحات php (فایل های با پسوند php) می سازیم که هر کدام برای منظورهای مختلفی به کار می روند. صفحات PHP با دو روش می توانند اطلاعات را دریافت کنند (البته اگر لازم باشد که اطلاعاتی را دریافت کنند) :
1- روش get
2- روش post

صفحات PHP توسط برنامه اندروید فراخوانی می شوند.

تعدادی از صفحات PHP لازم برای برنامه :
1- صفحه PHP برای نمایش لیست آخرین برنامه ها (دریافت اطلاعات آخرین برنامه ها از پایگاه داده MySQL و نمایش اطلاعات به صورت روش json)
2- صفحه PHP برای نمایش اطلاعات یک برنامه اندروید (دریافت id یک برنامه و سپس دریافت اطلاعات آن برنامه از پایگاه داده MySQL و نمایش اطلاعات به صورت روش json)
3- صفحه PHP برای login یا logout کردن کاربران
4- صفحه PHP برای انجام عملیات خرید برنامه
5- صفحه PHP برای ثبت نظر کاربر در مورد برنامه اندروید
و ...

استفاده از روش json برای دریافت اطلاعات توسط برنامه اندروید از صفحات PHP :

هنگامی که شما توسط برنامه اندروید، از یک صفحه اینترنتی، اطلاعاتی را دریافت می کنید، این اطلاعات می تواند به شکل های زیر باشد :
1- متن ساده
2- به شکل xml
3- به شکل json
و ...

روشی که برای این مورد توصیه می شود، روش json است. این روش، به دلیل نوع علامت گذاری هایی که دارد، حجم اطلاعات را به حداقل می رساند و بنابراین در پهنای باند استفاده شده توسط سرور اینترنتی سایت، صرفه جویی می شود.


ادامه دارد ...
 
آخرین ویرایش:

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
به روزرسانی (update) یک برنامه اندروید، از طریق اینترنت (سرور اینترنتی)

به روزرسانی (update) یک برنامه اندروید، از طریق اینترنت (سرور اینترنتی)

به منظور ایجاد امکان به روزرسانی (update) برنامه اندروید، می توان پنل برای به روزرسانی داشت، اما همچنین می توان که این به روزرسانی را به صورت خودکار نیز اجرا کرد (برای پنل نیز مشابه می باشد). من روند خودکار را شرح می دهم.


به روزرسانی (update) برنامه اندروید، می تواند به دو صورت کلی زیر صورت گیرد :


الف - دانلود نسخه جدید برنامه (دانلود فایل apk) :
در این حالت، فایل جدید برنامه اندروید، از سرور اینترنتی، دانلود شده و صفحه نصب آن به کاربر نمایش داده می شود.
ب- به روزرسانی (update) اطلاعات برنامه اندروید (بدون نیاز به نصب نسخه جدید برنامه اندروید)
در این حالت، تنها جدیدترین اطلاعات مربوط به برنامه اندروید، از سرور اینترنتی دانلود می شود و از این به بعد، این اطلاعات در برنامه نمایش داده خواهد شد (این مورد با برنامه های اندروید برای نمایش اطلاعات اینترنتی آنلاین، متفاوت است، زیرا اطلاعات درون خود برنامه اندروید قرار دارد و تنها اگر نسخه جدیدتری از اطلاعات وجود داشته باشد، آنها را دانلود کرده و جایگزین اطلاعات قبلی می کنیم. برای آشنایی با برنامه های اندروید با اطلاعات آنلاین، کلید شماره 2546 را بخوانید).
نکات مشترکی بین دو حالتی که گفتیم وجود دارد، بنابراین ما حالت دوم را شرح می دهیم و تنها توجه داشته باشید که برای حالت اول (دانلود فایل apk)، باید عملیات چک کردن نسخه فعلی و آخرین نسخه و در صورت لزوم، دانلود نسخه جدید و نمایش صفحه نصب به کاربر را در نظر بگیریم.


اگر قرار است اطلاعاتی را در برنامه اندروید داشته باشیم که هر از گاهی به روز شود، مهمترین نکات به شرح زیر می باشند :
1- آنها را به چه شکلی در برنامه اندروید ذخیره کنیم ؟
مثلا می توانیم اطلاعات را به یکی از شکل های زیر ذخیره کنیم :
الف- در پایگاه داده (database)
ب- در فایل متنی (به صورت متن ساده یا متن به شکل xml یا متن به شکل json یا ...)
ج- ذخیره توسط SharedPreferences
و ...


که البته استفاده از پایگاه داده (database)، منطقی تر است (مخصوصا زمانی که حجم اطلاعات، خیلی زیاد بوده و مدیریت آنها سخت است). اما موارد بالا برای اطلاعات از جنس متن است و برای مواردی مثل عکس، باید فایل، دانلود شده و در یک پوشه در حافظه خارجی برنامه اندروید ذخیره شود (البته ذخیره در پایگاه داده نیز امکان پذیر است، اما عده ای می گویند که کمی در سرعت برنامه تاثیرگذار است، یعنی بازیابی اطلاعات عکسها از پایگاه داده، برنامه را کمی کند می کند).


2- هر از چند مدت قرار است که اطلاعات برنامه به روز شود ؟
برای تعیین اینکه چه زمانی به روزرسانی (update) صورت گیرد، می توانیم حالت های زیر را در نظر بگیریم :


الف- ابتدا یک تاریخ در برنامه اندروید ذخیره می گردد (مثلا با استفاده از SharedPreferences). این تاریخ، آخرین تاریخ بروزرسانی شدن برنامه است. سپس بر اساس آن تاریخ، اگر مثلا بیش از یک هفته از بروزرسانی گذشته باشد، عملیات به روزرسانی اطلاعات انجام می شود.


ب- متغیری را در یک صفحه اینترنتی قرار می دهیم که شماره آخرین اطلاعات را نمایش می دهد و یک مقدار را هم در خود برنامه اندروید، به عنوان آخرین نسخه از اطلاعات که در برنامه اندروید قرار گرفته (به روزرسانی شده) را به ما نشان می دهد. پس تنها باید از آن صفحه، شماره آخرین اطلاعات را دریافت کرده و با شماره اطلاعات موجود در برنامه اندروید، مقایسه کنیم. اگر یک شماره جدید از اطلاعات در سرور اینترنتی موجود باشد، عملیات به روز رسانی آغاز می گردد. (دقت کنید که برای زمانی که خود فایل apk برنامه اندروید را می خواهیم دانلود کنیم تا کاربر، نسخه جدید برنامه را نصب کند، نیازی به تعریف متغیر نیست و خود versionCode برنامه اندروید، معیاری برای مقایسه جدید یا قدیمی بودن برنامه اندروید می باشد. یادآوری می کنم که شماره مربوط به versionCode ، در فایل AndroidManifest.xml از پروژه اندروید تعریف می شود)


دریافت اطلاعات متنی، معمولا با روش json انجام می شود (یعنی متن را به صورت json دریافت می کنیم).
خوب حالا فرض می کنیم که مثلا یک برنامه پیامکی دارید. همچنین فرض کنیم که قصد دارید اطلاعات آن را در یک پایگاه داده (database) ذخیره کنید و اطلاعات را هم با شماره اطلاعات در سرور اینترنتی چک می کنید. مراحل به صورت زیر است :

1- ابتدا یک تابع (یا method - روش) باید داشته باشید که با ورود کاربر به برنامه شما، چک کند که اصلا به اینترنت متصل است یا نه. در این زمینه، اموزش های قبلی را بخوانید.

اگر به اینترنت متصل نبود، ادامه این عملیات متوقف شده و همان روند معمولی نمایش اطلاعات برنامه اندروید به کاربر، اجرا می گردد. در صورت متصل بودن به اینترنت، مرحله بعد اجرا می شود.

2- در صورت متصل بودن به اینترنت، شماره آخرین اطلاعات موجود در سرور را از یک صفحه اینترنتی دریافت می کنید (چون تنها یک شماره است، می توانید به صورت متن ساده آن را بگیرید و یا اگر برایتان فرقی ندارد، از روش json استفاده کنید). سپس شماره را با شماره اطلاعات موجود در خود برنامه اندروید مقایسه می کنید. چنانچه شماره اطلاعات برنامه اندروید، همان آخرین شماره اطلاعات موجود در سرور باشد، ادامه این عملیات متوقف شده و همان روند معمولی نمایش اطلاعات برنامه اندروید به کاربر، اجرا می گردد.در غیر این صورت، مرحله بعد اجرا می شود.

3- اگر اطلاعات برنامه اندروید، قدیمی باشد، با روش json ، اطلاعات جدید را از سرور دریافت کرده و به پایگاه داده اضافه می کنیم (یا به جای همان اطلاعات قبلی قرار می دهیم).

4- روند عادی نمایش اطلاعات برنامه اندروید به کاربر، اجرا می شود.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
دریافت اطلاعات متنی از سرور اینترنتی، با روش json و پردازش اطلاعات دریافتی با کلاس های (class) مرتبط با روش json

دریافت اطلاعات متنی از سرور اینترنتی، با روش json و پردازش اطلاعات دریافتی با کلاس های (class) مرتبط با روش json

دریافت اطلاعات متنی از سرور اینترنتی (یک URL)، با روش json و پردازش اطلاعات دریافتی با کلاس های (class) مرتبط با روش json و همچنین نمایش اطلاعات در یک ListView (به همراه تست برنامه اندروید برای متن فارسی)، در برنامه نویسی اندروید :




در مباحثی دیگر، شرح دادیم که برای دریافت اطلاعات متنی از سرور اینترنتی، روش های زیر را می توانیم به کار ببریم (در واقع، ساختار متن) :

1- متن ساده

2- متن با ساختار xml

3- متن با ساختار json

و ...

مسلما در اطلاعات متنی، باید ساختاری خاص داشته باشیم تا بتوانیم مقادیر مربوط به هر متغیر را دقیقا متوجه بشویم. برای استفاده از متن ساده، باید خودمان یک نوع علامت گذاری ابداع کنیم و سپس بر اساس آن، با کلاس های (class) کار با رشته ها (string)، بر اساس نوع علامت گذاری، اطلاعات را از متن ساده دریافت شده، استخراج کنیم، اما برنامه نویس قرار نیست که وقت خود را برای این موارد صرف کند، بلکه بهتر است از ساختارهایی که قبلا به عنوان یک استاندارد در آمده اند و کلاس هایی (class) هم برای کار با آنها طراحی شده است، استفاده کند. در این مورد، دو روش xml و json ، دو استاندارد قابل قبول می باشند. اما چرا ما از بین این دو، روش json را انتخاب می کنیم ؟ اگر مباحث دیگر سایت کلیدستان را خوانده باشید، مشاهده کرده اید که من تقریبا برای تمامی موارد دریافت اطلاعات متنی از سرور اینترنتی، روش json را توصیه کرده ام. دلیل این انتخاب این است که اگر نوع علامت گذاری روش های xml و json را با یکدیگر مقایسه کنید، مشاهده می کنید که روش json برای ساخت ساختار متن، تعداد کاراکتر کمتری به کار می برد و بنابراین متن نهایی، حجم کمتری خواهد داشت، ولی روش xml باعث می شود که حجم متن نهایی (متن ساختاریافته به شکل xml) بیشتر از روش json باشد. شاید این مسئله برای یک برنامه ساده که حداکثر تعداد کاربر آن به 500 کاربر می رسد، اهمیتی نداشته باشد، اما مثلا برای یک بازی اندروید آنلاین که ممکن است به صورت هم زمان، بین 5000 تا 100000 کاربر به سرور اینترنتی متصل شوند و به تبادل اطلاعات با سرور بپردازند، بسیار با اهمیت خواهد بود.

حال که اهمیت روش json را متوجه شده اید، بهتر است که ساختار آن را به شما نمایش بدهم. من یک حالت ساده را در نظر می گیرم، همینکه با روش json و نحوه دریافت اطلاعات به روش json آشنا شوید، سپس می توانید به سراغ ساختارهای پیچیده تر بروید.

نکته مهم :

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

ساخت فایل حاوی متن با ساختار json و قرار دادن آن در سرور اینترنتی :

فرض کنید که اطلاعاتی که قرار است از سرور اینترنتی دریافت کنیم، نام و مشخصات 10 فرد می باشد (من عمدا اطلاعات را با یک کلمه ثابت و یک پسوند متغیر انتخاب کرده ام تا کلمات مختلف، شما را گیج نکند) :
id فردنام فردشهر سکونت فرد
نام گره (node) در روش jsonidnamecity
فرد اولid_1name_1city_1
فرد دومid_2name_2city_2
فرد سومid_3name_3city_3
فرد چهارمid_4name_4city_4
فرد پنجمid_5name_5city_5
فرد ششمid_6name_6city_6
فرد هفتمid_7name_7city_7
فرد هشتمid_8name_8city_8
فرد نهمid_9name_9city_9
فرد دهمid_10name_10city_10
اکنون باید اطلاعات فوق را در یک فایل ذخیره کنیم تا برنامه اندروید، آن فایل را بخواند. من نوع فایل را html انتخاب می کنم و متن درون آن به صورت زیر خواهد بود (متن با ساختار json) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"kelidestan"[/COLOR][COLOR=#339933]:[/COLOR][COLOR=#009900][[/COLOR] 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_1"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_1"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_1"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_2"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_2"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_2"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_3"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_3"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_3"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_4"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_4"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_4"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_5"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_5"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_5"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_6"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_6"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_6"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_7"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_7"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_7"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_8"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_8"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_8"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_9"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_9"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_9"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_10"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_10"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_10"[/COLOR] [COLOR=#009900]}[/COLOR] 
[COLOR=#009900]][/COLOR][COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
در متن بالا، kelidestan یک JSONArray (آرایه json) است و id و name و city ، سه گره (node) برای آن JSONArray (آرایه json) می باشند. امکان تعریف چند JSONArray (آرایه json) دیگر هم بود (به تعداد دلخواه)، اما برای سادگی، تنها یکی نوشته ایم.

دقت کنید که من به طور ساده، دقیقا همین متن را در فایل html کپی می کنم، بنابراین مراقب باشید که هیچ کد html ای را نباید در فایل مورد نظر بنویسید (این مورد را قبلا در اموزش 13م این تاپیک تذکر داده بودیم).

اگرچه ما متن را به صورت ساده می نویسیم، ولی معمولا ساختار برنامه های اندروید با اطلاعات آنلاین، به این صورت است که اطلاعات در پایگاه داده می باشد و در صفحه اینترنتی مورد نظر، کدهایی نوشته می شود که اطلاعات را از پایگاه داده دریافت کند و سپس با پردازش آنها، اطلاعات را با ساختار json ، در خروجی نمایش خواهد داد (این مورد را در اموزش 16ام این تاپیک شرح داده ایم). ولی فعلا به این مسائل کاری نداریم و تنها قصد داریم که روش json را شرح بدهیم.

فایل html را ساخته و آن را در آدرس زیر در سرور سایت کلیدستان قرار می دهم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http://www.kelidestan.com/fixed-url/kelidestan-json-1.html[/FONT]
[/FONT][/COLOR]
اگر دقت کنید، فایل مورد نظر، در پوشه ای (folder) با نام fixed-url در سایت کلیدستان قرار داده شده است، این پوشه، برای فایل هایی است که دیگر تحت هیچ شرایطی، آدرس URL فایل های درون آن و یا محتویات فایل های آن را تغییر نمی دهیم، بنابراین شما با خیال راحت، برای همیشه می توانید برای تست پروژه های اندروید کلیدستان و یا پروژه های اندروید نوشته شده توسط خودتان، از آنها استفاده کنید.

خوب حالا باید پروژه اندروید را بسازیم. دقت کنید که فایل های پروژه اندروید این مبحث و همچنین فایل apk ساخته شده از آن، در انتهای مبحث، قابل دانلود می باشند و بنابراین می توانید فایل های پروژه اندروید را دانلود کنید و همزمان با توضیحات من، نگاهی به آن بیندازید (البته در خود مبحث نیز من کدها را ذکر کرده و شرح می دهم).

خروجی برنامه به این صورت خواهد بود که در حین دریافت اطلاعات از سرور اینترنتی، یک ProgressDialog به کابر نمایش داده می شود (برای نمایش در حال اجرا بودن کدها) و سپس ProgressDialog حذف شده و خروجی برنامه اندروید، به صورت زیر نمایش داده می شود (لیست اطلاعات) :632.jpg
نام پروژه اندروید را برابر Json انتخاب کرده ایم (نام package برابر com.kelidestan.json انتخاب شده است. نام activity اصلی را برابر MainActivity انتخاب کرده ایم و فایل xml متناظر آن را هم برابر activity_main قرار داده ایم).

اجازه دسترسی به اینترنت :

قبل از هر چیز، چون قرار است که با اینترنت سر و کار داشته باشیم، باید اجازه دسترسی به اینترنت، به برنامه اندروید داده شود (همان اول آن را می نویسیم تا فراموش نشود، در غیر این صورت، یک force close ایجاد شده و برنامه اندروید بسته می شود). برای این منظور، کد زیر را باید در فایل Androidmanifest.xml از پروژه اندروید، بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین کل کدهای فایل Androidmanifest.xml به صورت زیر خواهد بود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]manifest xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    [B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.json"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionCode[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionName[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]sdk
        android[COLOR=#339933]:[/COLOR]minSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"8"[/COLOR]
        android[COLOR=#339933]:[/COLOR]targetSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"18"[/COLOR] [COLOR=#339933]/>[/COLOR]
    
    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.INTERNET"[/COLOR] [COLOR=#339933]/>[/COLOR]

    [COLOR=#339933]<[/COLOR]application
        android[COLOR=#339933]:[/COLOR]allowBackup[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR]
        android[COLOR=#339933]:[/COLOR]icon[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR]
        android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR]
        android[COLOR=#339933]:[/COLOR]theme[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@style/AppTheme"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.json.MainActivity"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR] [COLOR=#339933]>[/COLOR]
            [COLOR=#339933]<[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
                [COLOR=#339933]<[/COLOR]action android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.action.MAIN"[/COLOR] [COLOR=#339933]/>[/COLOR]

                [COLOR=#339933]<[/COLOR]category android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.category.LAUNCHER"[/COLOR] [COLOR=#339933]/>[/COLOR]
            [COLOR=#339933]</[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]</[/COLOR]application[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]manifest[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
ساخت کلاس JSONParser :

در هر پروژه اندرویدی که با روش json برای دریافت اطلاعات (اطلاعات ساختاریافته با روش json) از یک آدرس اینترنتی (آدرس URL) سر و کار داریم، باید یک کلاس (class) با عنوان JSONParser بسازیم (یک کلاس به صورت یک فایل جداگانه). کاری که کلاس JSONParser انجام می دهد این است که ما به آن، آدرس URL مربوط به فایل حاوی اطلاعات ساختاریافته با روش json را می دهیم و سپس کلاس JSONParser ، یک JSONObject به ما می دهد که در آن، همان اطلاعات ذخیره شده است و ما با استفاده از سایر کلاس های (class) تعریف شده برای کار با JSONObject ، می توانیم اطلاعات مورد نظرمان را از آن استخراج کنیم.

کدهای JSONParser در اکثر پروژه های اندروید، یکسان است و معمولا افراد کدها را از اینترنت دریافت می کنند و نیازی هم نیست که از نحوه عملکرد آن، اطلاعی داشته باشید. بننابراین در پروژه اندروید، یک کلاس (class) با نام JSONParser می سازیم :628.jpg
کدهای کلاس JSONParser را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.json[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]java.io.BufferedReader[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.IOException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.InputStream[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.InputStreamReader[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]java.io.UnsupportedEncodingException[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]org.apache.http.HttpEntity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.HttpResponse[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.client.ClientProtocolException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.client.methods.HttpPost[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.apache.http.impl.client.DefaultHttpClient[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.json.JSONException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.json.JSONObject[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.util.Log[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] JSONParser [COLOR=#009900]{[/COLOR]
        
        [B]static[/B] [COLOR=#003399]InputStream[/COLOR] is [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
    [B]static[/B] JSONObject jObj [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
    [B]static[/B] [COLOR=#003399]String[/COLOR] json [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]""[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#666666][I]// constructor[/I][/COLOR]
    [B]public[/B] JSONParser[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    [COLOR=#009900]}[/COLOR]
    [B]public[/B] JSONObject getJSONFromUrl[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR] url[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [COLOR=#666666][I]// Making HTTP request[/I][/COLOR]
        [B]try[/B] [COLOR=#009900]{[/COLOR]
            [COLOR=#666666][I]// defaultHttpClient[/I][/COLOR]
            DefaultHttpClient httpClient [COLOR=#339933]=[/COLOR] [B]new[/B] DefaultHttpClient[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            HttpPost httpPost [COLOR=#339933]=[/COLOR] [B]new[/B] HttpPost[COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            HttpResponse httpResponse [COLOR=#339933]=[/COLOR] httpClient.[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR]httpPost[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            HttpEntity httpEntity [COLOR=#339933]=[/COLOR] httpResponse.[COLOR=#006633]getEntity[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            is [COLOR=#339933]=[/COLOR] httpEntity.[COLOR=#006633]getContent[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]UnsupportedEncodingException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR]ClientProtocolException e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        [B]try[/B] [COLOR=#009900]{[/COLOR]
            [COLOR=#003399]BufferedReader[/COLOR] reader [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]BufferedReader[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] [COLOR=#003399]InputStreamReader[/COLOR][COLOR=#009900]([/COLOR]
                    is, [COLOR=#0000FF]"iso-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#CC66CC]8[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            StringBuilder sb [COLOR=#339933]=[/COLOR] [B]new[/B] StringBuilder[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#003399]String[/COLOR] line [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
            [B]while[/B] [COLOR=#009900]([/COLOR][COLOR=#009900]([/COLOR]line [COLOR=#339933]=[/COLOR] reader.[COLOR=#006633]readLine[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                sb.[COLOR=#006633]append[/COLOR][COLOR=#009900]([/COLOR]line [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]"[COLOR=#000099][B]\n[/B][/COLOR]"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]
            is.[COLOR=#006633]close[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            json [COLOR=#339933]=[/COLOR] sb.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            Log.[COLOR=#006633]e[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Buffer Error"[/COLOR], [COLOR=#0000FF]"Error converting result "[/COLOR] [COLOR=#339933]+[/COLOR] e.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        [COLOR=#666666][I]// try parse the string to a JSON object[/I][/COLOR]
        [B]try[/B] [COLOR=#009900]{[/COLOR]
            jObj [COLOR=#339933]=[/COLOR] [B]new[/B] JSONObject[COLOR=#009900]([/COLOR]json[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR]JSONException e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            Log.[COLOR=#006633]e[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"JSON Parser"[/COLOR], [COLOR=#0000FF]"Error parsing data "[/COLOR] [COLOR=#339933]+[/COLOR] e.[COLOR=#006633]toString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        [COLOR=#666666][I]// return JSON String[/I][/COLOR]
        [B]return[/B] jObj[COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
Activity اصلی برنامه اندروید :

خوب اکنون باید به سراغ Activity اصلی برنامه اندروید برویم که در آن، اطلاعات با استفاده از کلاس JSONParser از فایل اینترنتی (همان فایل html) دریافت شده و در یک JSONObject قرار داده می شود و سپس با یک سری کلاس های (class) کار با JSONObject ، اطلاعات را از JSONObject دریافت کرده و به صورت جداگانه، در سه لیست آرایه ای (ArrayList) از نوع رشته (string) ذخیره می کنیم و سپس اطلاعات این سه لیست آرایه ای (ArrayList) را در یک ListView نمایش می دهیم. این توضیح، خلاصه ای از کل فرآیند بود، اما اکنون تک تک آنها را شرح خواهیم داد.

همان طور که گفتیم، فایل activity_main.xml ، لایه گرافیکی متناظر برای Activity اصلی برنامه است :

630.jpg

چون قرار است اطلاعات در یک ListView نمایش داده شوند، بنابراین باید یک عنصر ListView درون فایل activity_main.xml وجود داشته باشد، بنابراین کدهای فایل activity_main.xml را به صورت زیر می نویسیم :

کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]LinearLayout xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"fill_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"fill_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]orientation[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"vertical"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR][COLOR=#003399]ListView[/COLOR]
        android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@android:id/list"[/COLOR]
        android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"fill_parent"[/COLOR]
        android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"wrap_content"[/COLOR] [COLOR=#339933]/>[/COLOR]
      
[COLOR=#339933]</[/COLOR]LinearLayout[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
همچنین برای ساختار گرافیکی ListView ، دو فایل xml برای آن می سازیم (یکی لایه گرافیکی برای خود ListView و دیگری، لایه گرافیکی برای هر item از ListView) :629.jpg

کدهای فایل list_layout.xml که برای ظاهر گرافیکی ListView می باشد را به صورت زیر می نویسیم (البته معمولا ممکن است که این لایه را از لایه های گرافیکی درون android.R.layout انتخاب کنند، اما من از کدهای یکی از آنها استفاده کرده ام و ترجیح دادم که خودم یک فایل بسازم، من از کد android.R.layout.simple_list_item_1 استفاده کرده ام) :
کد:
[FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<!--[/COLOR] Copyright [COLOR=#009900]([/COLOR]C[COLOR=#009900])[/COLOR] [COLOR=#CC66CC]2006[/COLOR] The Android Open Source Project

     Licensed under the Apache License, Version [COLOR=#CC66CC]2.0[/COLOR] [COLOR=#009900]([/COLOR]the [COLOR=#0000FF]"License"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
     you may not use [B]this[/B] file except in compliance with the License.
     [COLOR=#006633]You[/COLOR] may obtain a copy of the License at

          http[COLOR=#339933]:[/COLOR][COLOR=#666666][I]//www.apache.org/licenses/LICENSE-2.0[/I][/COLOR]

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an [COLOR=#0000FF]"AS IS"[/COLOR] BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     [COLOR=#006633]See[/COLOR] the License [B]for[/B] the specific language governing permissions and
     limitations under the License.
[COLOR=#339933]-->[/COLOR]

[COLOR=#339933]<[/COLOR]TextView xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@android:id/text1"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"wrap_content"[/COLOR]
    android[COLOR=#339933]:[/COLOR]textAppearance[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"?android:attr/textAppearanceLarge"[/COLOR]
    android[COLOR=#339933]:[/COLOR]gravity[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"center_vertical"[/COLOR]
    android[COLOR=#339933]:[/COLOR]paddingLeft[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"6dip"[/COLOR]
    android[COLOR=#339933]:[/COLOR]minHeight[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"?android:attr/listPreferredItemHeight"[/COLOR]
[COLOR=#339933]/>[/COLOR][/FONT]
مشاهده می کنید که کدهای آن بسیار ساده است و نیازی به بررسی آنها نیست.

کدهای فایل list_item.xml که ظاهر گرافیکی هر item (هر ردیف - row) از ListView را مشخص می کند را به صورت زیر می نویسیم :
کد:
[FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]LinearLayout xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]padding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"10dp"[/COLOR]
    android[COLOR=#339933]:[/COLOR]orientation[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"vertical"[/COLOR] [COLOR=#339933]>[/COLOR]
    
    [COLOR=#339933]<[/COLOR]LinearLayout android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
        android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"wrap_content"[/COLOR]
        android[COLOR=#339933]:[/COLOR]orientation[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"horizontal"[/COLOR] [COLOR=#339933]>[/COLOR]
        
        [COLOR=#339933]<[/COLOR]TextView
            android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@+id/textView1"[/COLOR]
            android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"80dp"[/COLOR]
            android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"wrap_content"[/COLOR]
            android[COLOR=#339933]:[/COLOR]padding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"5dp"[/COLOR]
            android[COLOR=#339933]:[/COLOR]textSize[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"15sp"[/COLOR]
            android[COLOR=#339933]:[/COLOR]text[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"Text_1"[/COLOR] [COLOR=#339933]/>[/COLOR]

        [COLOR=#339933]<[/COLOR]TextView
            android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@+id/textView2"[/COLOR]
            android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"80dp"[/COLOR]
            android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"wrap_content"[/COLOR]
            android[COLOR=#339933]:[/COLOR]padding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"5dp"[/COLOR]
            android[COLOR=#339933]:[/COLOR]textSize[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"15sp"[/COLOR]
            android[COLOR=#339933]:[/COLOR]text[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"Text_2"[/COLOR] [COLOR=#339933]/>[/COLOR]
        
        [COLOR=#339933]<[/COLOR]TextView
            android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@+id/textView3"[/COLOR]
            android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"80dp"[/COLOR]
            android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"wrap_content"[/COLOR]
            android[COLOR=#339933]:[/COLOR]padding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"5dp"[/COLOR]
            android[COLOR=#339933]:[/COLOR]textSize[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"15sp"[/COLOR]
            android[COLOR=#339933]:[/COLOR]text[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"Text_3"[/COLOR] [COLOR=#339933]/>[/COLOR]
        
    [COLOR=#339933]</[/COLOR]LinearLayout[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]LinearLayout[COLOR=#339933]>[/COLOR][/FONT]
همان طور که مشاهده می کنید، سه تا TextView برای هر ردیف (item) از ListView در نظر گرفته ایم، زیرا برای هر فرد، سه اطلاعات داشتیم (id - name - city) که باید در هر ردیف ListView نمایش داده شود.

اکنون که این موارد را شرح دادیم، می ماند کدهای java در فایل MainActivity.java که همان فایل مربوط به Activity اصلی برنامه است و کل فرآیند، با کدهای آن اجرا می شود :


631.jpg

کدهای فایل MainActivity.java را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.json[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]java.io.UnsupportedEncodingException[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]org.json.JSONArray[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.json.JSONException[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]org.json.JSONObject[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.ListActivity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.app.ProgressDialog[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.Context[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.AsyncTask[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.LayoutInflater[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.View[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.ViewGroup[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.ArrayAdapter[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.ListView[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.TextView[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] ListActivity [COLOR=#009900]{[/COLOR]
        
        [COLOR=#666666][I]//URL to get JSON Array[/I][/COLOR]
    [B]private[/B] [B]static[/B] [COLOR=#003399]String[/COLOR] url[COLOR=#339933];[/COLOR]
    
    [COLOR=#666666][I]//JSON Node Names[/I][/COLOR]
    [B]private[/B] [B]static[/B] [B]final[/B] [COLOR=#003399]String[/COLOR] json_name [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"kelidestan"[/COLOR][COLOR=#339933];[/COLOR]
    [B]private[/B] [B]static[/B] [B]final[/B] [COLOR=#003399]String[/COLOR] json_node_name_1 [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933];[/COLOR]
    [B]private[/B] [B]static[/B] [B]final[/B] [COLOR=#003399]String[/COLOR] json_node_name_2 [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933];[/COLOR]
    [B]private[/B] [B]static[/B] [B]final[/B] [COLOR=#003399]String[/COLOR] json_node_name_3 [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933];[/COLOR]
    
    JSONArray kelidestan [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#339933];[/COLOR]
    [B]public[/B] [COLOR=#003399]String[/COLOR] app_id_string[COLOR=#339933];[/COLOR]

    [B]public[/B] [COLOR=#003399]String[/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] json_string_1_all[COLOR=#339933];[/COLOR]
    [B]public[/B] [COLOR=#003399]String[/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] json_string_2_all[COLOR=#339933];[/COLOR]
    [B]public[/B] [COLOR=#003399]String[/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] json_string_3_all[COLOR=#339933];[/COLOR]
    
    [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] json_length[COLOR=#339933];[/COLOR]
    [B]public[/B] [COLOR=#003399]ListView[/COLOR] lv[COLOR=#339933];[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                url [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"http://www.kelidestan.com/fixed-url/kelidestan-json-1.html"[/COLOR][COLOR=#339933];[/COLOR]
                
                [B]new[/B] JSONParse[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        
        
        [B]public[/B] [B]class[/B] JSONParse [B]extends[/B] AsyncTask[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], [COLOR=#003399]String[/COLOR], JSONObject[COLOR=#339933]>[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]public[/B] ProgressDialog pDialog[COLOR=#339933];[/COLOR]
       @Override
       [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onPreExecute[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           [B]super[/B].[COLOR=#006633]onPreExecute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog [COLOR=#339933]=[/COLOR] [B]new[/B] ProgressDialog[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]setMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Getting Data ..."[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]setIndeterminate[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]setCancelable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR]
       @Override
       [B]public[/B] JSONObject doInBackground[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR]... [COLOR=#006633]args[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           JSONParser jParser [COLOR=#339933]=[/COLOR] [B]new[/B] JSONParser[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] 
           [COLOR=#666666][I]// Getting JSON from URL[/I][/COLOR]
           JSONObject json [COLOR=#339933]=[/COLOR] jParser.[COLOR=#006633]getJSONFromUrl[/COLOR][COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [B]return[/B] json[COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR]
        @Override
        [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onPostExecute[COLOR=#009900]([/COLOR]JSONObject json[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            pDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]try[/B] [COLOR=#009900]{[/COLOR]
                   [COLOR=#666666][I]// kelidestan[/I][/COLOR]
                   kelidestan [COLOR=#339933]=[/COLOR] json.[COLOR=#006633]getJSONArray[/COLOR][COLOR=#009900]([/COLOR]json_name[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#666666][I]// build String[/I][/COLOR]
                   json_length [COLOR=#339933]=[/COLOR] kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   json_string_1_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   json_string_2_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   json_string_3_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   [B]for[/B][COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] i [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR] i [COLOR=#339933]<[/COLOR] kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] i[COLOR=#339933]++[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                       JSONObject c [COLOR=#339933]=[/COLOR] kelidestan.[COLOR=#006633]getJSONObject[/COLOR][COLOR=#009900]([/COLOR]i[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       [COLOR=#666666][I]// Storing JSON item in a Variable --> with UTF-8 for persian words[/I][/COLOR]
                       json_string_1_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_1[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       json_string_2_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_2[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       json_string_3_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_3[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#009900]}[/COLOR]
                   
                   [COLOR=#666666][I]// show data in ListView[/I][/COLOR]
                   setListAdapter[COLOR=#009900]([/COLOR][B]new[/B] MyAdapter[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B], 
                                       R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]list_layout[/COLOR], 
                                       R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView1[/COLOR],
                                       json_string_1_all[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]     
                   lv [COLOR=#339933]=[/COLOR] getListView[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]      
           [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR]JSONException e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
               e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]UnsupportedEncodingException[/COLOR] e1[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                   e1.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#009900]}[/COLOR]
        [COLOR=#009900]}[/COLOR]
   [COLOR=#009900]}[/COLOR]
        
        
        [B]private[/B] [B]class[/B] MyAdapter [B]extends[/B] ArrayAdapter[COLOR=#339933]<[/COLOR]String[COLOR=#339933]>[/COLOR][COLOR=#009900]{[/COLOR]

                [B]public[/B] MyAdapter[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] context, [COLOR=#000066][B]int[/B][/COLOR] resource, [COLOR=#000066][B]int[/B][/COLOR] textViewResourceId,
                                [COLOR=#003399]String[/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] strings[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        [B]super[/B][COLOR=#009900]([/COLOR]context, resource, textViewResourceId, strings[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#666666][I]// TODO Auto-generated constructor stub[/I][/COLOR]
                [COLOR=#009900]}[/COLOR]
                
                @Override
                [B]public[/B] [COLOR=#003399]View[/COLOR] getView[COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] position, [COLOR=#003399]View[/COLOR] convertView, ViewGroup parent[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        LayoutInflater inflater [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]LayoutInflater[COLOR=#009900])[/COLOR]getSystemService[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR].[COLOR=#006633]LAYOUT_INFLATER_SERVICE[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#003399]View[/COLOR] row [COLOR=#339933]=[/COLOR] inflater.[COLOR=#006633]inflate[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]list_item[/COLOR], parent, [COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        
                        [COLOR=#003399]String[/COLOR] id [COLOR=#339933]=[/COLOR] json_string_1_all[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                        TextView tv_1 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TextView[COLOR=#009900])[/COLOR] row.[COLOR=#006633]findViewById[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        tv_1.[COLOR=#006633]setText[/COLOR][COLOR=#009900]([/COLOR]id[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        
                        [COLOR=#003399]String[/COLOR] name [COLOR=#339933]=[/COLOR] json_string_2_all[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                        TextView tv_2 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TextView[COLOR=#009900])[/COLOR] row.[COLOR=#006633]findViewById[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView2[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        tv_2.[COLOR=#006633]setText[/COLOR][COLOR=#009900]([/COLOR]name[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        
                        [COLOR=#003399]String[/COLOR] city [COLOR=#339933]=[/COLOR] json_string_3_all[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                        TextView tv_3 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TextView[COLOR=#009900])[/COLOR] row.[COLOR=#006633]findViewById[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView3[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        tv_3.[COLOR=#006633]setText[/COLOR][COLOR=#009900]([/COLOR]city[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
                        [B]return[/B] row[COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR]
                
                
        [COLOR=#009900]}[/COLOR]


[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون بخش های مختلف کد بالا را شرح می دهیم.

اگر به ابتدای کدهای Activity توجه کنید، متوجه می شوید که این Activity را بر اساس گسترش (extend) کلاس ListActivity ساخته ایم (نه بر اساس گسترش کلاس Activity)، زیرا می خواهیم در آن یک ListView را نمایش بدهیم (برای راحتتر کار کردن با ListView)(در واقع یک ListActivity است و ما برای راحتی، آن را با اصطلاح Activity بیان می کنیم):
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]public[/B] [B]class[/B] MainActivity [B]extends[/B] ListActivity [COLOR=#009900]{[/COLOR][/FONT]
[/FONT][/COLOR]
در ابتدای کدها، نام JSONArray (آرایه json) و همچنین نام مربوط به 3 گره (node) را در متغیرهایی تعریف کرده ایم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#666666][I]//JSON Node Names[/I][/COLOR]
[B]private[/B] [B]static[/B] [B]final[/B] [COLOR=#003399]String[/COLOR] json_name [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"kelidestan"[/COLOR][COLOR=#339933];[/COLOR]
[B]private[/B] [B]static[/B] [B]final[/B] [COLOR=#003399]String[/COLOR] json_node_name_1 [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933];[/COLOR]
[B]private[/B] [B]static[/B] [B]final[/B] [COLOR=#003399]String[/COLOR] json_node_name_2 [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933];[/COLOR]
[B]private[/B] [B]static[/B] [B]final[/B] [COLOR=#003399]String[/COLOR] json_node_name_3 [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
کدهای روش onCreate ، به شرح زیر می باشد (یعنی کدهایی که به محض اجرای Activity ، اجرا می شوند) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                url [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"http://www.kelidestan.com/fixed-url/kelidestan-json-1.html"[/COLOR][COLOR=#339933];[/COLOR]
                
                [B]new[/B] JSONParse[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
در این کدها، ابتدا مقدار متغیر url را تعیین کرده ایم که در آن، آدرس URL مربوط به فایل حاوی اطلاعات در سرور اینترنتی، ذخیره می شود. سپس از روی کلاس (class) با نام JSONParse (با کلاس JSONParser آن را اشتباه نگیرید) که اتفاقا کدهای تعریف آن، در میان کدهای همین Activity می باشد، یک شیء (object) ساخته ایم و سپس آن را اجرا می کنیم.

اگر یادتان باشد، در ابتدای مبحث، تذکر دادم که می توانید کدهایی را به پروژه اندروید اضافه کنید که ابتدا چک کند که گوشی کاربر به اینترنت متصل می باشد یا خیر و تنها در صورت متصل بودن به اینترنت، کدها اجرا شوند. این عملیات را می توانیم برای خط زیر از کدها اجرا کنیم زیرا این خط، باعث اجرای فرآیند دریافت اطلاعات از سرور اینترنت می شود و می توانیم بر روی آن شرط بگذاریم که اگر به اینترنت وصل بودیم، اجرا شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]new[/B] JSONParse[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]execute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
خوب حالا برویم به سراغ کلاس JSONParse و ببینیم که کدهای آن چگونه است که با اجرای آن، کل عملیات دریافت اطلاعات و نمایش آن، اجرا می شود. کدهای کلاس JSONParse ، به صورت زیر نوشته شده است :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]        [B]public[/B] [B]class[/B] JSONParse [B]extends[/B] AsyncTask[COLOR=#339933]<[/COLOR][COLOR=#003399]String[/COLOR], [COLOR=#003399]String[/COLOR], JSONObject[COLOR=#339933]>[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]public[/B] ProgressDialog pDialog[COLOR=#339933];[/COLOR]
       @Override
       [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onPreExecute[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           [B]super[/B].[COLOR=#006633]onPreExecute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog [COLOR=#339933]=[/COLOR] [B]new[/B] ProgressDialog[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]setMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Getting Data ..."[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]setIndeterminate[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]setCancelable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR]
       @Override
       [B]public[/B] JSONObject doInBackground[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR]... [COLOR=#006633]args[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           JSONParser jParser [COLOR=#339933]=[/COLOR] [B]new[/B] JSONParser[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] 
           [COLOR=#666666][I]// Getting JSON from URL[/I][/COLOR]
           JSONObject json [COLOR=#339933]=[/COLOR] jParser.[COLOR=#006633]getJSONFromUrl[/COLOR][COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [B]return[/B] json[COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR]
        @Override
        [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onPostExecute[COLOR=#009900]([/COLOR]JSONObject json[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            pDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]try[/B] [COLOR=#009900]{[/COLOR]
                   [COLOR=#666666][I]// kelidestan[/I][/COLOR]
                   kelidestan [COLOR=#339933]=[/COLOR] json.[COLOR=#006633]getJSONArray[/COLOR][COLOR=#009900]([/COLOR]json_name[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#666666][I]// build String[/I][/COLOR]
                   json_length [COLOR=#339933]=[/COLOR] kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   json_string_1_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   json_string_2_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   json_string_3_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   [B]for[/B][COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] i [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR] i [COLOR=#339933]<[/COLOR] kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] i[COLOR=#339933]++[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                       JSONObject c [COLOR=#339933]=[/COLOR] kelidestan.[COLOR=#006633]getJSONObject[/COLOR][COLOR=#009900]([/COLOR]i[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       [COLOR=#666666][I]// Storing JSON item in a Variable --> with UTF-8 for persian words[/I][/COLOR]
                       json_string_1_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_1[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       json_string_2_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_2[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       json_string_3_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_3[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#009900]}[/COLOR]
                   
                   [COLOR=#666666][I]// show data in ListView[/I][/COLOR]
                   setListAdapter[COLOR=#009900]([/COLOR][B]new[/B] MyAdapter[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B], 
                                       R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]list_layout[/COLOR], 
                                       R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView1[/COLOR],
                                       json_string_1_all[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]     
                   lv [COLOR=#339933]=[/COLOR] getListView[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]      
           [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR]JSONException e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
               e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]UnsupportedEncodingException[/COLOR] e1[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                   e1.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#009900]}[/COLOR]
        [COLOR=#009900]}[/COLOR]
   [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
همان طور که مشاهده می کنید، کلاس JSONParse بر اساس AsyncTask ساخته شده است، یعنی یک ProgressDialog به کاربر نمایش داده می شود و در حین نمایش آن، یک سری عملیات اجرا می گردد (در این حالت، دریافت اطلاعات از آدرس URL و تبدیل آن به یک JSONObject) و پس از پایان عملیات، دیگر ProgressDialog نمایش داده نمی شود و از JSONObject ، اطلاعات مورد نظرمان را استخراج کرده و در یک ListView نمایش می دهیم. بنابراین AsyncTask شامل سه قسمت زیر است :

1- onPreExecute

2- doInBackground

3- onPostExecute

اکنون کدهای این سه بخش را شرح می دهیم :

1- onPreExecute :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]       @Override
       [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onPreExecute[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           [B]super[/B].[COLOR=#006633]onPreExecute[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog [COLOR=#339933]=[/COLOR] [B]new[/B] ProgressDialog[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]setMessage[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"Getting Data ..."[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]setIndeterminate[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]setCancelable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           pDialog.[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
با کدهای فوق، یک ProgressDialog می سازیم و به کاربر نمایش می دهیم تا در حین اجرای کدهای بخش doInBackground ، کاربر این ProgressDialog را ببیند و بداند که یک سری عملیات در حال اجرا می باشد.

2- doInBackground :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]       @Override
       [B]public[/B] JSONObject doInBackground[COLOR=#009900]([/COLOR][COLOR=#003399]String[/COLOR]... [COLOR=#006633]args[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
           JSONParser jParser [COLOR=#339933]=[/COLOR] [B]new[/B] JSONParser[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] 
           [COLOR=#666666][I]// Getting JSON from URL[/I][/COLOR]
           JSONObject json [COLOR=#339933]=[/COLOR] jParser.[COLOR=#006633]getJSONFromUrl[/COLOR][COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [B]return[/B] json[COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
در همان حال که کاربر یک ProgressDialog را می بیند، باید با استفاده از کلاس JSONParser ، اطلاعات را از فایل موجود در آدرس URL دریافت کرده و به یک JSONObject تبدیل کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]JSONParser jParser [COLOR=#339933]=[/COLOR] [B]new[/B] JSONParser[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
برای این منظور، یک شیء (object) با نام jParser از کلاس JSONParser می سازیم و به آن، آدرس URL فایل را می دهیم تا یک JSONObject حاوی اطلاعات را به ما برگرداند :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]JSONObject json [COLOR=#339933]=[/COLOR] jParser.[COLOR=#006633]getJSONFromUrl[/COLOR][COLOR=#009900]([/COLOR]url[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
با برگرداندن JSONObject ، کدهای بخش onPostExecute از AsyncTask اجرا خواهد شد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]return[/B] json[COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
3- onPostExecute :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]        @Override
        [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onPostExecute[COLOR=#009900]([/COLOR]JSONObject json[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            pDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]try[/B] [COLOR=#009900]{[/COLOR]
                   [COLOR=#666666][I]// kelidestan[/I][/COLOR]
                   kelidestan [COLOR=#339933]=[/COLOR] json.[COLOR=#006633]getJSONArray[/COLOR][COLOR=#009900]([/COLOR]json_name[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#666666][I]// build String[/I][/COLOR]
                   json_length [COLOR=#339933]=[/COLOR] kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   json_string_1_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   json_string_2_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   json_string_3_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   [B]for[/B][COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] i [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR] i [COLOR=#339933]<[/COLOR] kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] i[COLOR=#339933]++[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                       JSONObject c [COLOR=#339933]=[/COLOR] kelidestan.[COLOR=#006633]getJSONObject[/COLOR][COLOR=#009900]([/COLOR]i[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       [COLOR=#666666][I]// Storing JSON item in a Variable --> with UTF-8 for persian words[/I][/COLOR]
                       json_string_1_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_1[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       json_string_2_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_2[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       json_string_3_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_3[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#009900]}[/COLOR]
                   
                   [COLOR=#666666][I]// show data in ListView[/I][/COLOR]
                   setListAdapter[COLOR=#009900]([/COLOR][B]new[/B] MyAdapter[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B], 
                                       R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]list_layout[/COLOR], 
                                       R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView1[/COLOR],
                                       json_string_1_all[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]     
                   lv [COLOR=#339933]=[/COLOR] getListView[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]      
           [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR]JSONException e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
               e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
           [COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]UnsupportedEncodingException[/COLOR] e1[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                   e1.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#009900]}[/COLOR]
        [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
در بخش onPostExecute ، اولین اقدام این است که دیگر ProgressDialog به کاربر نمایش داده نشود، بنابراین با کد زیر، آن را ناپدید (dismiss) می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]pDialog.[COLOR=#006633]dismiss[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون کدهای مربوط به استخراج اطلاعات از JSONObject دریافت شده را با try و catch انجام می دهیم (باعث می شود که در صورت مواجه شدن با یک یا دو نوع خطا، به جای بسته شدن برنامه اندروید، یک سری کد دیگر اجرا شود). در قسمت try ، کدهای زیر را داریم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]                   [COLOR=#666666][I]// kelidestan[/I][/COLOR]
                   kelidestan [COLOR=#339933]=[/COLOR] json.[COLOR=#006633]getJSONArray[/COLOR][COLOR=#009900]([/COLOR]json_name[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#666666][I]// build String[/I][/COLOR]
                   json_length [COLOR=#339933]=[/COLOR] kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   json_string_1_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   json_string_2_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   json_string_3_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   [B]for[/B][COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] i [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR] i [COLOR=#339933]<[/COLOR] kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] i[COLOR=#339933]++[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                       JSONObject c [COLOR=#339933]=[/COLOR] kelidestan.[COLOR=#006633]getJSONObject[/COLOR][COLOR=#009900]([/COLOR]i[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       [COLOR=#666666][I]// Storing JSON item in a Variable --> with UTF-8 for persian words[/I][/COLOR]
                       json_string_1_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_1[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       json_string_2_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_2[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       json_string_3_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_3[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#009900]}[/COLOR]
                   
                   [COLOR=#666666][I]// show data in ListView[/I][/COLOR]
                   setListAdapter[COLOR=#009900]([/COLOR][B]new[/B] MyAdapter[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B], 
                                       R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]list_layout[/COLOR], 
                                       R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView1[/COLOR],
                                       json_string_1_all[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]     
                   lv [COLOR=#339933]=[/COLOR] getListView[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]  [/FONT]
[/FONT][/COLOR]
ما در کل متن مورد نظرمان، یک JSONArray (آرایه json) با نام kelidestan داشتیم، اما امکان اینکه چند JSONArray (آرایه json) دیگر هم تعریف کنیم، وجود داشت، اما برای سادگی، همین یکی را در نظر گرفتیم. حالا با روش getJSONArray ، اطلاعات این JSONArray (آرایه json) را از JSONObject استخراج می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]kelidestan [COLOR=#339933]=[/COLOR] json.[COLOR=#006633]getJSONArray[/COLOR][COLOR=#009900]([/COLOR]json_name[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
با کدهای زیر، اطلاعات مربوط به id و name و city را در سه لیست آرایه ای (ArrayList) از نوع رشته (string) ذخیره می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]                   [COLOR=#666666][I]// build String[/I][/COLOR]
                   json_length [COLOR=#339933]=[/COLOR] kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   json_string_1_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   json_string_2_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   json_string_3_all [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR]kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                   [B]for[/B][COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] i [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR] i [COLOR=#339933]<[/COLOR] kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] i[COLOR=#339933]++[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
                       JSONObject c [COLOR=#339933]=[/COLOR] kelidestan.[COLOR=#006633]getJSONObject[/COLOR][COLOR=#009900]([/COLOR]i[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       [COLOR=#666666][I]// Storing JSON item in a Variable --> with UTF-8 for persian words[/I][/COLOR]
                       json_string_1_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_1[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       json_string_2_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_2[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                       json_string_3_all[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] [B]new[/B][COLOR=#003399]String[/COLOR][COLOR=#009900]([/COLOR]c.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]json_node_name_3[COLOR=#009900])[/COLOR].[COLOR=#006633]getBytes[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"ISO-8859-1"[/COLOR][COLOR=#009900])[/COLOR], [COLOR=#0000FF]"UTF-8"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                   [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
با کد زیر، تعداد عناصر آرایه json با نام kelidestan را به دست می آوریم (همان تعداد 10 عدد) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]json_length [COLOR=#339933]=[/COLOR] kelidestan.[COLOR=#006633]length[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
سپس سه لیست آرایه ای (ArrayList) از نوع رشته (string) با همان تعداد عنصر ساخته ایم و مقادیر را در آنها ذخیره کرده ایم.

نکته :

اگر مقادیر به زبان فارسی باشند، به کار بردن عبارت UTF-8 در کدها الزامی است تا کاراکترهای فارسی، به درستی نمایش داده شوند.

خوب اکنون که مقادیر را در سه لیست آرایه ای (ArrayList) با نام های json_string_1_all و json_string_2_all و json_string_3_all داریم، تنها باید آنها را در ListView نمایش بدهیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]                   [COLOR=#666666][I]// show data in ListView[/I][/COLOR]
                   setListAdapter[COLOR=#009900]([/COLOR][B]new[/B] MyAdapter[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B], 
                                       R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]list_layout[/COLOR], 
                                       R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView1[/COLOR],
                                       json_string_1_all[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]     
                   lv [COLOR=#339933]=[/COLOR] getListView[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]  [/FONT]
[/FONT][/COLOR]
دقت شود که در کد بالا، از کلاس MyAdapter استفاده کرده ایم که کدهای تعریف آن، در انتهای همین Activity ، به صورت زیر نوشته شده است :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]        [B]private[/B] [B]class[/B] MyAdapter [B]extends[/B] ArrayAdapter[COLOR=#339933]<[/COLOR]String[COLOR=#339933]>[/COLOR][COLOR=#009900]{[/COLOR]

                [B]public[/B] MyAdapter[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] context, [COLOR=#000066][B]int[/B][/COLOR] resource, [COLOR=#000066][B]int[/B][/COLOR] textViewResourceId,
                                [COLOR=#003399]String[/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] strings[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        [B]super[/B][COLOR=#009900]([/COLOR]context, resource, textViewResourceId, strings[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#666666][I]// TODO Auto-generated constructor stub[/I][/COLOR]
                [COLOR=#009900]}[/COLOR]
                
                @Override
                [B]public[/B] [COLOR=#003399]View[/COLOR] getView[COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] position, [COLOR=#003399]View[/COLOR] convertView, ViewGroup parent[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        LayoutInflater inflater [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]LayoutInflater[COLOR=#009900])[/COLOR]getSystemService[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR].[COLOR=#006633]LAYOUT_INFLATER_SERVICE[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#003399]View[/COLOR] row [COLOR=#339933]=[/COLOR] inflater.[COLOR=#006633]inflate[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]list_item[/COLOR], parent, [COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        
                        [COLOR=#003399]String[/COLOR] id [COLOR=#339933]=[/COLOR] json_string_1_all[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                        TextView tv_1 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TextView[COLOR=#009900])[/COLOR] row.[COLOR=#006633]findViewById[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        tv_1.[COLOR=#006633]setText[/COLOR][COLOR=#009900]([/COLOR]id[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        
                        [COLOR=#003399]String[/COLOR] name [COLOR=#339933]=[/COLOR] json_string_2_all[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                        TextView tv_2 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TextView[COLOR=#009900])[/COLOR] row.[COLOR=#006633]findViewById[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView2[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        tv_2.[COLOR=#006633]setText[/COLOR][COLOR=#009900]([/COLOR]name[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        
                        [COLOR=#003399]String[/COLOR] city [COLOR=#339933]=[/COLOR] json_string_3_all[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                        TextView tv_3 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TextView[COLOR=#009900])[/COLOR] row.[COLOR=#006633]findViewById[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView3[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        tv_3.[COLOR=#006633]setText[/COLOR][COLOR=#009900]([/COLOR]city[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
                        [B]return[/B] row[COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
در کدهای کلاس MyAdapter ، سه تا TextView ای که برای هر item (ردیف - row) از Listview ، تعریف کرده بودیم را شناسایی کرده و سپس بر اساس مقدار position که همان شماره ترتیب قرارگیری item ها است، یک عنصر از هر یک از سه لیست آرایه ای (ArrayList) ، فراخوانی کرده و در TextView ها نمایش می دهیم (نمایش سه عنصر در سه TextView) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]                        [COLOR=#003399]String[/COLOR] id [COLOR=#339933]=[/COLOR] json_string_1_all[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                        TextView tv_1 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TextView[COLOR=#009900])[/COLOR] row.[COLOR=#006633]findViewById[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        tv_1.[COLOR=#006633]setText[/COLOR][COLOR=#009900]([/COLOR]id[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        
                        [COLOR=#003399]String[/COLOR] name [COLOR=#339933]=[/COLOR] json_string_2_all[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                        TextView tv_2 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TextView[COLOR=#009900])[/COLOR] row.[COLOR=#006633]findViewById[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView2[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        tv_2.[COLOR=#006633]setText[/COLOR][COLOR=#009900]([/COLOR]name[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        
                        [COLOR=#003399]String[/COLOR] city [COLOR=#339933]=[/COLOR] json_string_3_all[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
                        TextView tv_3 [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TextView[COLOR=#009900])[/COLOR] row.[COLOR=#006633]findViewById[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]textView3[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        tv_3.[COLOR=#006633]setText[/COLOR][COLOR=#009900]([/COLOR]city[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین مراحل ساخت این پروژه اندروید را شرح دادیم. خروجی نهایی برنامه اندروید، به صورت زیر می باشد :

633.jpg

تست برنامه اندروید برای زبان فارسی :

چنانچه قصد دارید که برنامه اندروید ساخته شده را برای زبان فارسی هم تست کنید، آدرس اینترنتی صفحه (آدرس URL) را برابر آدرس زیر قرار بدهید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]http://www.kelidestan.com/fixed-url/kelidestan-json-2.html[/FONT]
[/FONT][/COLOR]
نتیجه به صورت زیر می باشد :

1310.jpg


فایل های پروژه اندروید را می توانید از لینک های زیر دریافت کنید :
 

پیوست ها

  • 90.zip
    929.1 کیلوبایت · بازدیدها: 0
  • 91.rar
    263.1 کیلوبایت · بازدیدها: 0

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
چگونگی دریافت متنهایی که شامل علامت " هستند، توسط روش json (بدون به هم ریختن ساختار json که وابسته به این علامت است)

چگونگی دریافت متنهایی که شامل علامت " هستند، توسط روش json (بدون به هم ریختن ساختار json که وابسته به این علامت است)

قبلا در مورد روش json صحبت کردیم که چگونه متن دارای ساختار json را توسط برنامه اندروید از سرور اینترنتی دریافت کنیم. اما اگر دقت کرده باشید، در متن ساختاریافته بر اساس روش json ، علامت " نقش مهمی دارد. مثلا در همان مبحث، متن ساختاریافته بر اساس روش json به صورت زیر بود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"kelidestan"[/COLOR][COLOR=#339933]:[/COLOR][COLOR=#009900][[/COLOR] 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_1"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_1"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_1"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_2"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_2"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_2"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_3"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_3"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_3"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_4"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_4"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_4"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_5"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_5"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_5"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_6"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_6"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_6"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_7"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_7"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_7"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_8"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_8"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_8"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_9"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_9"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_9"[/COLOR] [COLOR=#009900]}[/COLOR] , 
[COLOR=#009900]{[/COLOR] [COLOR=#0000FF]"id"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"id_10"[/COLOR], [COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"name_10"[/COLOR], [COLOR=#0000FF]"city"[/COLOR][COLOR=#339933]:[/COLOR] [COLOR=#0000FF]"city_10"[/COLOR] [COLOR=#009900]}[/COLOR] 
[COLOR=#009900]][/COLOR][COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اما یک سوال مهم پیش می آید و آن این است که اکر در میان متن هایی که باید در ساختار json قرار دهیم، علامت " وجود داشت، آنگاه چه اتفاقی می افتد. بدون هیچ شکی، ساختار json به هم می ریزد و دیگر اطلاعات را به درستی نمی توانیم پردازش کنیم. بنابراین باید به دنبال راه حل باشیم. راه حل برای این مورد بسیار ساده است. تنها باید در متن هایی که قصد داریم آنها را با روش json ارسال کنیم، علامت " را به علامت "\ تبدیل کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#0000FF]"   ---->   [COLOR=#000099][B]\"[/B][/COLOR][/COLOR][/FONT]
[/FONT][/COLOR]
مسلما قرار نیست که تمام علامت های " را به صورت دستی پیدا کرده و تبدیل به علامت "\ کنیم، بلکه می توانیم از توابع مربوط به جایگزینی متن استفاده کنیم (در هر زبانی که کد می نویسیم، اینگونه توابع وجود دارند). مثلا اگر در حال کدنویسی با زبان PHP در سرور اینترنتی باشیم، کافی است که از تابع str_replace استفاده کنیم. کد PHP زیر را ببینید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]php
$myVariable [COLOR=#339933]=[/COLOR] str_replace[COLOR=#009900]([/COLOR][COLOR=#0000FF]'"'[/COLOR], [COLOR=#0000FF]'[COLOR=#000099][B]\"[/B][/COLOR]'[/COLOR], $myVariable[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#339933]?>[/COLOR][/FONT]
[/FONT][/COLOR]
کد PHP بالا، تمامی علامت های " موجود در متن ذخیره شده در متغیر myVariable را پیدا کرده و علامت های "\ را جایگزین آنها می کند. بنابراین برای متن هایی که حدس می زنیم ممکن است که در آنها علامت " وجود داشته باشد، حتما باید این مورد را در نظر بگیریم تا در پردازش اطلاعات، مشکلی به وجود نیاید.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
جلوگیری از خطای Unterminated object at character هنگام کار با متن ساختاریافته به شکل json و پردازش آن، در برنامه نویسی اندروید

جلوگیری از خطای Unterminated object at character هنگام کار با متن ساختاریافته به شکل json و پردازش آن، در برنامه نویسی اندروید

هنگام دریافت و پردازش یک متن ساختاریافته به شکل json ، ممکن است که با خطایی با متن مشابه متن زیر روبرو شویم (متن خطا در LogCat در برنامه eclipse) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]Error[/COLOR] parsing data org.[COLOR=#006633]json[/COLOR].[COLOR=#006633]JSONException[/COLOR][COLOR=#339933]:[/COLOR] Unterminated object at character [COLOR=#CC66CC]12577[/COLOR] of ...[/FONT]
[/FONT][/COLOR]
همان طور که از متن خطا می توان حدس زد، مشکل از ساختار متن است که به صورت صحیح و بر اساس استانداردهای json نبوده و عدم قرارگیری صحیح علامت " این مشکل را به وجود آورده است. این مورد، بیشتر زمانی اتفاق می افتد که در مقادیری که در متن json قرار می دهیم، علامت " وجود داشته باشد و بنابراین چون این علامت، مرتبط با ساختار json است، کل ساختار به هم می ریزد. بنابراین باید در مقادیر، علامت " را به دو علامت زیر تبدیل کنیم تا مشکلی به وجود نیاید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]\[COLOR=#0000FF]"[/COLOR][/FONT]
[/FONT][/COLOR]
چنانچه متن json را در سرور اینترنتی و با زبان PHP می سازید، می توانید از کد PHP زیر در صفحه اینترنتی برای جایگزینی علامت ها استفاده کنید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]php
$myValue [COLOR=#339933]=[/COLOR] str_replace[COLOR=#009900]([/COLOR][COLOR=#0000FF]'"'[/COLOR],[COLOR=#0000FF]'[COLOR=#000099][B]\"[/B][/COLOR]'[/COLOR],$myValue[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#339933]?>[/COLOR][/FONT]
[/FONT][/COLOR]
 
Similar threads
بالا