loading...

بهترین مرجع مقالات اموزشی طراحی اپلیکیشن در مشهد

بازدید : 147
يکشنبه 8 تير 1404 زمان : 16:11


مقایسه کاتلین و C#‎
یک کدام از تفاوت‌های نحوی کاتلین با C#‎ عدم اجباری بودن به کارگیری از نقطه-ویرگول (Semicolon) در کاتلین میباشد. همینطور، آفریننده‌ها (Constructors) در طراحی اپلیکیشن در مشهد کاتلین تماماً گوناگون میباشند.

در کاتلین یک تولیدکننده مهم (Primary Constructor) وجود دارااست که صرفا از پارامترها در درون پرانتز درست شده میباشد و همینطور یک Initializer نیز همچون بدنه آفریننده شغل می‌نماید. آفریننده‌های ثانویه در کاتلین نسبتاًً شبیه C#‎ میباشند. این تفاوت میتواند در بالا مقداری سردرگمی تولید نماید.

مقایسه کاتلین و سی شارپ در مقایسه زامارین و اندروید استودیو

البته بعداز مدتی می‌اقتدار به‌این سود رسید که کاتلین منش بهتری نسبت به C#‎ در ساز و عمل تولیدکننده‌ها ارائه می دهد. یکی خصوصیت‌های فوق‌العاده در کاتلین قابلیت تعریف و تمجید Propertyها صحیح در درون آفریننده میباشد و بعداً می‌اقتدار از این Propertyها‌ به صورت کلی کلاس نیز استفاده نمود. واپسین تفاوت لازم به ذکر دربین کاتلین و C#‎، روش کاتلین به سمت «پوچ‌ناپذیری» (Non-Nullability) میباشد. یعنی همچنان می‌اقتدار از نوع پوچ در کاتلین بهره مند شد ولی می بایست پوچ بودن را به صورت بدیهی معین کرد.

مقایسه کاتلین و سی شارپ در مقایسه زامارین و اندروید استودیو

منطق C#‎ درباره ی پوچ‌پذیری به‌این شکل میباشد که تک تک اشکال در کاتلین همچون نوع یه خرده (Value Type) در C#‎ کار می‌نمایند. یعنی می‌قدرت آنها‌را پوچ‌پذیر کرد البته آغاز می بایست کامپایلر را نسبت بدین قضیه باخبر کرد. این خصوصیت جالبی میباشد ولی برنامه نویس ها اولیه بایستی به آن عادت نمایند. مثلا همانندی‌های کاتلین و C#‎ می‌قدرت به قابلیت به کار گیری از Lambdas به صورت پیش‌فرض در هر دو لهجه اشاره نمود.


در کاتلین حتی می‌اقتدار از کلاس‌های ناشناس مشابه به جاوا بهره برد. در کاتلین به کلاس‌های ناشناس «شی» گفته می گردد. در کاتلین استعمال از شی ها در حین تولید Listenerها کاربرد دارااست. هنگامی که Listener فقط یک مشی داشته باشد، می تواند به طور اتومات به یک Lambda تبدیل (Convert) خواهد شد. در صورتیکه که Listener یک سری روال داشته باشد، بایستی از یک شی مصرف شود. این شی، واسط متبوع را پیاده‌سازی خواهد کرد.

اختلال کتابخانه‌های فرد ثالث در Xamarin
در‌حالتی که که نیاز به به کارگیری از کتابخانه‌ای وجود داشته باشد که به وسیله گوگل منتشر نشده باشد و یا این که هر کتابخانه دیگری که پایین جانبداری Xamarin نباشد، به احتمال زیاد قابلیت به کارگیری از آن کتابخانه در Xamarin وجود نخواهد داشت.


اما می‌قدرت دربین C#‎ و کتابخانه‌های مندرج به گویش جاوا لینک (Binding) ساخت و از آن ها استفاده نمود، ولی اعمال این فعالیت مستلزم یک قدم بیش‌خیس و شغل های مازاد خواهد بود. می بایست در حیث داشت که‌این روند و قدم اضافه بایستی هر توشه در به‌روزرسانی یک کتابخانه تکرار خواهد شد. ولی با به کارگیری از اندروید استودیو و Gradle مراحل اضافه کردن یک کتابخانه به پروژه بسیار بی آلایش و در توان اسکن و Paste کردن یک خط کد در نرم افزار میباشد.

بسط چندپلتفرمی با Xamarin و توسعه و گسترش انحصاری اندروید در Android Studio
یکی‌از دیگر از نکات کلیدی که می بایست در مقایسه زامارین و اندروید استودیو مد حیث قرار بگیرد، چندپلتفرمی بودن Xamarin میباشد. چنانچه که قصد بسط نرم افزار هم برای iOS و هم برای اندروید وجود داشته باشد، گزینش Xamarin مطلقاً‌ شایسته ترین گزینش خواهد بود.

در حالی که در حالتی که غرض صرفا پیشرفت یک نرم افزار اندرویدی باشد، به احتمال زیاد گوشه و کنار گسترش Android Studio ترجیح داده می‌گردد. معمولاً در کاربردهای تجاری و برای مثالً بسط نرم افزار‌های کسب و کار الکترونیک مانند یک فروشگاه آنلاین، برای استحصال به بازار پهناور‌خیس بایستی در تمامی پلتفرم‌ها حضور داشت و نمی‌اقتدار فقطً‌ به ساخت‌و‌ساز نرم افزار برای یک پلتفرم خاص، مثل اندروید، بسنده کرد.

همینطور، بحران‌های مالی و گفت و گو هزینه مطرح میباشد و یک کمپانی یا این که استارتاپ نوباوه ممکن میباشد دارایی و منابع کافی در دست نداشته باشد. بدین ترتیب، به مکان استخدام دو دسته غیر وابسته برای توسعه و گسترش اندروید و iOS می‌قدرت صرفا از یک دسته بسط جهت ایجاد کرد محصولی چندپلتفرمی استفاده نمود و ایجاد کرد این متاع نیز قادر است با Xamarin صورت بپذیرد. اما ابزارهای چندپلتفرمی دیگری نظیر React Native هم وجود دارا‌هستند که ممکن میباشد بسته به موقعیت و نیازمندی‌ها گزینش بهتری به شمار فرایند.

عدم ارائه Xamarin برای لینوکس
یکی‌از دیگر از نکاتی که در مقایسه زامارین و اندروید استودیو عنایت داراست، عدم امان قانونی Xamarin از لینوکس میباشد. یعنی قابلیت و امکان نصب و به کارگیری قانونی از زامارین در سیستم ادله لینوکس نیست. البته از طرف دیگر ورژن اندروید استودیو برای لینوکس ارائه گردیده و قابل به کار گیری میباشد.

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

عدم ارائه Xamarin برای لینوکس | مقایسه زامارین و اندروید استودیو

به طور طبیعیً این اشخاص می بایست قید استعمال از Xamarin را بزنند و از Android Studio استعمال نمایند. اما خط مش‌هایی برای به کارگیری از Xamarin در لینوکس اوبونتو وجود دارااست ولی به آسانی نصب و فعال سازی در ویندوز و مک سیستم عامل وجود ندارد. برای به کارگیری از Xamarin در لینوکس، به صورت خلاصه آغاز بایستی جاوا، Mono و اندروید استودیو را نصب کرد و آن‌گاه کامپایل Xamarin.Android نیز می بایست بوسیله خویش نرم افزار نویس صورت بپذیرد و در غایت می بایست پیکربندی ما یحتاج در IDE متبوع برای فعالیت با Xamarin صورت پذیرد.

بحران‌های نصب، دانلود و به‌روزرسانی
یکی‌از دیگر از شاخص‌های اصلی در مقایسه زامارین و اندروید استودیو ، بحران‌های نصب، دانلود و به‌روزرسانی هر کدام از این دو فناوری میباشد. دانلود و نصب اندروید استودیو با آی‌پی کشور ایران قابلیت و امکان‌پذیر وجود ندارد و گوگل اذن دسترسی به برگه دانلود Android Studio را به یوزرها اهل ایران نمی‌دهد.

همینطور برای نصب ضمایم، SDKها و بقیه بسته‌ها و حتی به‌روزرسانی اندروید استودیو نیاز به تغییر و تحول آی‌پی وجود داراست که میتواند باعث به کاهش سرعت دانلود و اتلاف وقت خواهد شد. البته می‌اقتدار به راحتی Visual Studio را به همدم پلتفرم Xamarin سوای نیاز به او‌پی‌ان دانلود و نصب کرد. در زمینه‌ی فضای اشغال گردیده نیز می بایست اظهار‌کرد که‌این قضیه بسته به حالت متعدد میباشد، ولی در کل می بایست اظهار‌کرد که نیاز به فضای بیش‌تری برای نصب و استعمال از Xamarin وجود داراست.

کاستی در Layout Designer زامارین
در طراح دکوراسیون (Layout Designer) زامارین کاستی‌هایی وجود دارااست. در حالی که، در اندروید استودیو می‌اقتدار از طرح‌بندی مقید (Constrained Layout) فارغ از هیچ مشکلی بهره مند شد و برخلاف زامارین، Designer به خیر عمل می‌نماید.

بازدید : 41
شنبه 7 تير 1404 زمان : 12:46


یادگرفتن Git برای گسترش دهندگان اندروید (قسمت سوم) – از صفر تا صد
در نصیب گذشته این محرمانه مطالب آموزشی به رسیدگی فهرستی از عملیات Git که قابلیت و امکان یک پارچه‌سازی Git و اضافه کردن آن به پروژه‌های اندروید را آماده می‌سازد پرداخته‌ایم. درین نصیب از یادگرفتن Git درخصوص پنجره در دست گرفتن ورژن در انتهای اندروید استودیو که با استعمال از دکمه‌های میانبر Alt+9 قابل طراحی اپلیکیشن در مشهد مفتوح کردن میباشد توضیح میدهیم.
در پی مواقعی که را که روی تصویر فوق شماره‌گذاری گردیده‌اند به ترتیب توضیح می دهیم.

ورقه تغییرات محلی
برای رفرش کردن حالت تغییرات محلی.
برای کامیت کردن تغییرات محلی با کلیدهای میانبر Ctrl + K.
برای بازگردانی تغییرات با کلیدهای میانبر Ctrl + Alt + Z.
برای تولید یک فهرست تغییرات تازه.
برای حذف فهرست تغییرات انتخابی.
برای فعال کردن فهرست تغییرات.
برای انتقال پوشه انتخابی به فهرست تغییرات دیگر.
برای انتقال پوشه انتخابی یا این که فهرست تغییرات به shelf با کلیدهای میانبر Ctrl + Alt + H
برای اکران تفاوت‌های فولدر انتخابی با واپسین بازبینی با کلیدهای میانبر Ctrl + D.
برای توسعه دور و اطراف جهت اکران تمامی فولدر‌ها با کلیدهای میانبر + Ctrl + NumPad.
برای انباشته کردن کلیه فولدر‌ها با کلیدهای میانبر - Ctrl + NumPad.
برای اکران فولدر‌های تغییر‌و تحول یافته که مطابق فولدر تیم‌بندی گردیده‌اند.
برای نسخه برداری کردن مسیر پوشه انتخابی به ویدئو بورد سیستم با کلیدهای میانبر Ctrl + C.
برای اکران فهرست پوشه‌های نادیده گرفته گردیده.
برای تنظیمات فولدر‌هایی که از سوی Git نادیده گرفته خواهند شد.
برای گشودن نصیب پیش‌اکران جهت مقایسه پوشه انتخابی با واپسین بازبینی کامیت گردیده.

شیت Log
درپی توضیحات مرتبط با نصیب‌هایی که در تصویر فوق شماره‌گذاری گردیده‌اند را مراعات می کنید:

منوی بازشدنی برای غربال کردن log بر طبق شاخه انتخابی استعمال می‌گردد.
برای غربال کردن log مبتنی بر استفاده کننده انتخابی.
برای غربال کردن log بر طبق زمان هنگامی انتخابی.
برای غربال کردن بر پایه ی مسیر پوشه اصلاح گردیده.
IntellSort - یک مسیر ریلکس برای مشاهده ترکیب‌ها، با اکران کامیت‌های ورودی پایین کامیت ترکیب.
برای اکران بی نقص شاخه‌های زمان بر.
برای رفرش فهرستی از کامیت‌ها با کلیدهای میانبر Ctrl + F5.
برای رفتن به یک hash یا این که تگ یا این که شاخه با کلیدهای میانبر Ctrl + F.
برای به‌کارگیری تغییرات کامیت انتخابی برای شاخه سرازیر.
درصورتی که میخواهید فقط کامیت‌ها را از یک شاخه داشته باشید؛ در این حالت نیازی به مخلوط نخواهید داشت، چون همگی کامیت‌ها را از شاخه شما اخذ خواهد کرد. دراین‌صورت می توانید تنهاً بعضا کامیت‌ها را تعیین کرده و به شاخه خویش اضافه نمایید.
هایلایت کردن کامیت غیرانتخابی. برای هایلایت کردن کامیت از شاخه انتخابی که هنوز روی شاخه روان ایفا نشده میباشد.
صفحه Console
در‌این صفحه، قادر خواهیم بود حاصل دستورهای Git را که ایفا گردیده‌اند ببینیم. البته نمی‌توانیم دستورهای Git را در اینجا ببینیم و به مکان آن از پنجره ترمینال به کار گیری کنیم.

ورقه History
در‌این ورقه می توانید تاریخچه‌ای از فولدر انتخابی یا این که پروژه را ملاحظه کنید. تاریخچه مجموع تغییرات ساخت گردیده در پروژه را با داده ها روشنی مانند اسم پیشرفت‌دهنده، فرصت، پوشه‌های تغییر تحول یافته و مفاد دیگر اکران میدهد.

امید است ایده‌ای در زمینه‌ی پنجره در اختیار گرفتن ورژن در اندروید استودیو داشته باشید. به این ترتیب سیستم در اختیار گرفتن ورژن را در ارتباط با عملیات جان دار در اندروید استودیو توضیح داده‌ایم.

بازدید : 135
پنجشنبه 5 تير 1404 زمان : 11:23


پروفایل کردن نرم افزار ها با اندروید استودیو – به لهجه بی آلایش
یک کدام از سؤالاتی که توسعه و گسترش‌دهندگان بایستی از خویش بپرسند این میباشد که در حالتی‌که یوزرها در طول استعمال از نرم افزار احساس نماید بودن بکنند چه عمل می‌قدرت کرد؟ جواب این سؤال همواره بی‌فکر پر‌نور وجود ندارد؛ البته در اکثر وقت ها مورد ها با وظایفی که به کارگیری سنگینی از CPU دارا هستند و نخ اساسی را مسدود می‌نمایند مرتبط میباشد. همینطور کلاس‌هایی وجود دارا هستند که‌این نوع از خطاها عملکردی در آنان با استعمال از یاد مرتبط میباشد. در‌این نوشته با نحوه پروفایل کردن نرم افزار اندروید طراحی اپلیکیشن در مشهد آشنا می‌شویم.
پروفایل کردن به چه معنی میباشد و چه کمکی می‌نماید؟
شما میتوانید بعضی لاگ‌ها را اکران دهید تا به عیب‌یابی نرم افزار یاری نمائید؛ البته بایستی با کدبیس نرم افزار آشنا باشید تا بتوانید لاگ‌ها را در جای ‌های مطلوب قرار دهید.


کلیک نمائید
در‌صورتی‌که میخواهید آیتم دیگری را پژوهش فرمائید که فقطً مطابق لاگ وجود ندارد، خوب میباشد از ابزار Android Profiler به کار گیری نمایید که در ورژن 3.0 اندروید استودیو معرفی شد‌ه‌است. گسترش‌دهندگان می توانند از این ابزار برای تحقیق بر استعمال از CPU و همینطور مصرف یاد، تعبیر و تفسیر جواب‌های کانال و حتی مشاهده مصرف انرژی فایده بگیرند.

مبنی بر داده‌های معیاری که اندروید پروفایلر ارائه می‌نماید، قادر خواهیم بود فهم و شعور بهتری از طرز به کارگیری از CPU و دیگر منابع خاطر از سوی نرم افزار داشته باشیم. این‌ها مواقعی می‌باشند که در غایت مارا به یافتن منشأ ایراد پند می‌نمایند.

اشتباهات خاطر
درین قسمت به رسیدگی رئیس خاطر در اندروید میپردازیم و براین اساس قادر خواهیم بود شعور کنیم که چرا به کارگیری نامناسب از خاطر میتواند موجب خطاها عملکردی گردد. نرم افزار اندروید نیز مانند هر نرم افزار قابل انعطاف‌افزاری کلاینت دیگر در دور و اطراف مقید به یاد ایفا میشود. سیستم ادله اندروید قسمت محصور ولی انعطاف‌پذیری از هیپ خاطر را برای هر نرم افزار در هم اکنون اعمال تخصیص می دهد.

سیستم برهان اندروید در زمان زمان حیات نرم افزار خاطر‌ای به آن تخصیص میدهد تا شیوه نامه‌ها و داده‌های اپلیکیشن را در آن ذخیره نماید. مقدار یاد موردنیاز به نوع نرم افزار متعلق میباشد. برای مثال یک نرم افزار برای اکران تصویر کل ورقه bitmap ممکن میباشد به یاد بیشتری نسبت به متن کل ورقه نیاز داشته باشد.

هنگامی که یک قسمت از یاد دیگر مورد نیاز نباشد، سیستم ادله اندروید به صورت خود کار این منبع یاد را گشوده پس می گیرد تا بتواند برای درخواست‌های اختصاص یاد نو آیتم استعمال قرار دهد. این فرآیند به اسم Garbage Collection شناخته می‌گردد.

Garbage Collection معمولاً تأثیری روی سعی نرم افزار‌ها ندارد، زیرا فرصت تاخیر نرم افزار در فیض مراحل Garbage Collection ناچیز میباشد. با این حالا در‌صورتی‌که رویدادهای Garbage Collection زیاد شوند و در برهه زمانی کوتاهی فیس دهند، یوزرها به‌تدریج تجربیات کاربری توأم با نماید شدن در نرم افزار خواهند داشت.

پروفایل کردن یاد با اندروید پروفایلر
پیش‌نیازهای پروفایل کردن اندروید این میباشد که اندروید ورژن 3.0 یا این که فراتر را نصب فرمایید و یک دستگاه آزمایش یا این که مشابه‌ساز به آن وصل نمایید که دست کم SDK سطح 26 یا این که فراتر را جاری ساختن نماید. هنگامی که‌این قابل انعطاف‌افزارها مهیا شدند می توانید روی صفحه profiler در پنل انتهایی کلیک نمایید تا پروفایلر اندروید گشوده گردد.


استارت اندروید پروفایلر
نرم افزار خویش را در وضعیت دیباگ استارت نمایید تا مشاهده کنید که اندروید پروفایلر معیارهای آنی را برای CPU، Memory، Network و Energy اکران می دهد.


اندروید پروفایلر در اکنون اعمال
روی قسمت Memory کلیک فرمایید تا ریزه کاری معیارهای مصرف خاطر را مشاهده کنید. اندروید پروفایلر یک مرور بصری از مصرف خاطر در حین فرصت ارائه می‌نماید.


چنان که در نمودار فوق می بینید، یک نقط ی اوج مصرف ابتدایی وجود دارااست که در طول اجرای نخستین نرم افزار ساخته شده است و بعد یک افت داریم و در غایت به یک خط صاف رسیده میباشد. این کردار معمول یک نرم افزار hello world معمولی میباشد.

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

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


کلیک نمایید
یک گراف در هم اکنون رویش
در‌صورتی‌که یک خط فرآیند مشاهده‌ میکنید که مداوماً و با شیب ملایم در درحال حاضر پرورش میباشد، میتواند ناشی از نشت خاطر باشد، یعنی بخشی از خاطر اپ نمی‌تواند آزاد گردد. همینطور این حالت می تواند ناشی از عدم وجود یاد کافی برای نرم افزار باشد. وقتی که نرم افزار به محدودیت خاطر میرسد و سیستم برهان اندروید یاد دیگری به نرم افزار اختصاص نمی‌دهد، خطای OutOfMemoryError به وجود خواهد آمد.


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


1/***
2 * In order to stress the memory usage,
3 * this activity creates 100000 rows of TextView when user clicks on the start button
4 */
5class HighMemoryUsageActivity : AppCompatActivity() {
6
7 val NO_OF_TEXTVIEWS_ADDED = 100000
8
9 override fun onCreate(savedInstanceState: Bundle?) {
10 super.onCreate(savedInstanceState)
11 setContentView(R.layout.activity_high_memory_usage)
12
13 supportActionBar?.setDisplayHomeAsUpEnabled(true)
14 supportActionBar?.setTitle(R.string.activity_name_high_memory_usage)
15 btn_start.setOnClickListener {
16 addRowsOfTextView()
17 }
18 }
19
20 override fun onSupportNavigateUp(): Boolean {
21 onBackPressed()
22 return true
23 }
24
25 /**
26 * Add rows of text views to the root LinearLayout
27 */
28 private fun addRowsOfTextView() {
29 val linearLayout = findViewById(R.id.linear_layout)
30
31 val textViewParams = LinearLayout.LayoutParams(
32 LinearLayout.LayoutParams.MATCH_PARENT,
33 LinearLayout.LayoutParams.WRAP_CONTENT
34 )
35
36 val textViews = arrayOfNulls(NO_OF_TEXTVIEWS_ADDED)
37
38 for (i in 0 until NO_OF_TEXTVIEWS_ADDED) {
39 textViews[i] = TextView(this)
40 textViews[i]?.layoutParams = textViewParams
41 textViews[i]?.text = i.toString()
42 textViews[i]?.setBackgroundColor(getRandomColor())
43 linearLayout.addView(textViews[i])
44 linearLayout.invalidate()
45 }
46 }
47
48 /**
49 * Creates a random color for background color of the text view.
50 */
51 private fun getRandomColor(): Int {
52 val r = Random()
53 val red = r.nextInt(255)
54 val green = r.nextInt(255)
55 val blue = r.nextInt(255)
56
57 return Color.rgb(red, green, blue)
58 }
59}
مشاهده بی نقص کدها
این اکتیویتی از هیچ AdapterView یا این که RecyclerView برای بازیافت نماهای گزینه به کارگیری نمی‌نماید. از این رو تولید 100 هزار نما برای کامل شدن اجرای ()addRowsOfTextView مورد نیاز میباشد.

فعلا روی دکمه Start کلیک فرمایید تا مصرف یاد را در اندروید استودیو آیتم رسیدگی قرار دهید. این مصرف خاطر رو به پرورش میباشد و در غایت نرم افزار از شغل می‌ افتد. این به عبارتی خوی آیتم انتظار میباشد.

چاره اصلاح این خلل سرراست میباشد. کافی میباشد از RecyclerView به کارگیری نمایید تا نماهای مورد را آیتم به کارگیری دوباره قرار دهد و بنابراین تعداد ساخت و ساز نما را کم کند. بنابراین مصرف خاطر نیز کاهش می یابد. نمودار پایین مصرف خاطر را در حین وجود به عبارتی 100 هزار نمای گزینه علامت می دهد و میبینید که بهبود متعددی در کاهش مصرف یاد در نمونه مرتبط با کاربرد RecyclerView به دست آمده میباشد.

بازدید : 53
چهارشنبه 4 تير 1404 زمان : 16:55


ایراد عدم فراخوانی onMessageReceived
این اختلال به نحوه رئیس نوتیفیکیشن‌ها مربوط می‌گردد و به payload نوتیفیکیشن نیز رابطه داراست. تابع onMessageReceived به طور پیش‌فرض فقط وقتی فراخوانی می‌گردد که نرم افزار در پیش‌مسئله میباشد. این بدان مضمون‌ میباشد که هنگامی نرم افزار در پس‌قضیه میباشد و یا این که کلاً گشوده نشده میباشد، سیستم نوتیفیکیشن را طراحی اپلیکیشن در مشهد برای ما رئیس می‌نماید.


کلیک نمایید
در حالتی‌که می خواهید نوتیفیکیشن را در هر دو موقعیت مدیر فرمائید، دو مورد وجود دارااست. یکی‌از این که بعداز کلیک کردن روی نوتیفیکیشن ایفا دهید و دیگری آن که آن را مستقیماً وقتی که وارد می شود مدیر نمایید. به دنبال به رسیدگی payload نوتیفیکیشن می پردازیم:

1{
2 "message":{
3 "token":"...",
4 "notification":{
5 "title":"This is your notification\'s title",
6 "body":"This is the body text of your notification"
7 },
8 "data" : {
9 "first_name" : "Android",
10 "last_name" : "Roboto"
11 }
12 }
13}

هرزمان که یک title و یک body در نوتیفیکیشن وجود داشته باشد، سیستم آن را در پس‌مورد مدیر می‌نماید. وقتی که data در payload باشد و روی نوتیفیکیشن کلیک فرمایید میتوانید آن را در خدمت خودتان مدیر فرمایید.

در حالتی که در نوتیفیکیشن خویش title و body ندارید، نوتیفیکیشن ورودی همواره به خدمت میرسد. این بدان مضمون‌ میباشد که شما بایستی نوتیفیکیشن را خودتان بسازید تا بتوانید آن را اکران دهید.

شبکه‌های نوتیفیکیشن چه می باشند؟
از اندروید O (سطح API 26) به آنگاه قابلیت به کارگیری از شبکه‌های نوتیفیکیشن وجود دارااست. چنانچه هیچ چیزی تعریف‌و‌تمجید نشده باشد، تمامی نوتیفیکیشن‌ها در شبکه پیش‌فرض ارسال می گردند. با این درحال حاضر می‌قدرت با اضافه کردن قطعه کد پایین به مانیفست یک شبکه پیش‌فرض مخصوص نیز تمجید کرد:

1 2 android:name="com.google.firebase.messaging.default_notification_channel_id"
3 android:value="@string/my_default_notification_channel" />

درصورتی که نوتیفیکیشن‌ها مشتمل بر شناسه شبکه نباشند، درین شبکه پیش‌فرض سفارشی قرار می گیرند.

همینطور قادر خواهیم بود یک قدم بالاتر گذاشته و استارت به تمجید شبکه‌های خاص خودمان بکنیم. این کاری میباشد که در کلاس Application تحت ایفا داده‌ایم:

1class MyApp : Application() {
2 override fun onCreate() {
3 super.onCreate()
4
5 // Create notification channels
6 initNotificationChannels()
7
8 // ... Do other stuff
9 }
10
11 private fun initNotificationChannels() {
12 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
13 // Build your channel
14 val myChannel = NotificationChannel(
15 MessagingService.MY_CHANNEL_ID,
16 getString(R.string.my_channel_title), // The channel title in the app settings
17 NotificationManager.IMPORTANCE_DEFAULT)
18 .apply {
19 // The description of the channel in the app settings
20 description = getString(R.string.channel_podcasts_description)
21 }
22
23 // Register the channel with the system
24 val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
25 notificationManager.createNotificationChannel(myChannel)
26 }
27 }
28}
مشاهده بدون نقص کدها
به همین آسانی میباشد. فعلا میتوانید نوتیفیکیشن‌ها را از روش payload نوتیفیکیشن و یا این که از روش MessagingService به شبکه خاص خویش تحویل دهید.

حرف نهایی

امید واریم از تحقیق این نوشته ی علمی سود مایحتاج را برده باشید و با طرز مدیر نوتیفیکیشن در نرم افزار‌ها آشنا گردیده باشید.

ویژگی های نهفته tools در اندروید استودیو – راهنمای کاربردی
احتمالاً بیشتر شما خوانند‌گان مه این مقاله را برای بازرسی گزینش کرده‌اید با ویژگی‌های خیره کننده XML با پیشوند :tools در طول پیاده سازی لی‌آوت نرم افزار در اندروید استودیو شغل کرده‌اید. اکثر وقت ها ما از ویژگی tools:text به صورت مکرر در مواقعی که متن می بایست به طور دینامیک در طی ایفا اضافه خواهد شد و از این رو استعمال از ویژگی android:text میسر وجود ندارد به کار گیری می کنیم. در‌این راهنما میخواهیم مبادرت به شناخت با مختصات نهفته tools:‎ در اندروید استودیو بکنیم.
با این اکنون ارتباط اکثر اوقات ما با این ابزار قوی بالاتر از ویژگی‌های tools:text, tools:visibility و tools:context نمی‌رود. البته بخش اعظمی از شرایط‌ها وجود دارا‌هستند که احاطه داشتن روی این ابزار موجب می‌گردد اشتباهات حل شوند و از مجدد‌کاری‌های متعددی پرهیز گردد. به این ترتیب درین نوشته ی علمی در زمینه‌ی ویژگی‌های tools کلام می کنیم. به دنبال همت می کنیم فهم و شعور بهتری از شیوه عمل این ویژگی‌ها و کمکی که می توانند به ما در اپ‌نویسی اندروید بکنند به دست آوریم.

مرور کلی
پیش از هر چیز و قبل از آن که وارد ریزه کاری tools بشویم، بایستی یک مرور کلی روی ویژگی‌های tools داشته باشیم و روش استعمال از آنها‌را توضیح دهیم.


کلیک نمائید
به ذکر کلی ویژگی‌های tools، در واقع مختصات XML خاصی میباشند که خیر صرفا خصوصیت‌های مجال پیاده سازی (مانند این که کدام لی‌آوت می بایست باطن فرگمان ترسیم گردد) را در مشت ما قرار میدهند، بلکه رفتارهای فرصت کامپایل مانند سرکوب هشدارهای lint را نیز در دست گرفتن می‌نمایند.

مطابق راهنمای کاربری قانونی، این مختصات صرفا از سوی اندروید استودیو مصرف شده و در طی build نرم افزار از سوی build tools حذف میشوند. براین اساس استعمال از این ویژگی‌ها تأثیری روی اندازه APK و خلق مجال انجام ندارد.

برای به کار گیری از این ویژگی‌ها فضای اسم tools می بایست به عنصر ریشه فولدر xml چنان که در تحت اکران یافته اضافه گردد:

1 2xmlns:tools=”http://schemas.android.com/tools" >

مطابق تابعی که ویژگی ایفا می‌نماید، می توانیم ویژگی‌های tools را به سه گروه تقسیم کنیم

بازدید : 131
سه شنبه 3 تير 1404 زمان : 11:54


چه وقتی از نخ‌های دستگیره به کارگیری کنیم؟
نخ‌های دستگیره راه حل‌هایی بهتر برای اجرای شغل های پس‌مورد با فرصت اجرای زمان بر می باشند که طراحی اپلیکیشن در مشهد مستلزم به‌روزرسانی UI نیستند.

ThreadPoolExecutor
در‌این قسمت به رسیدگی «استخر نخ» (Thread Pool) میپردازیم.

استخر نخ چیست؟
خواسته از استخر نخ در واقع یک دسته از نخ‌ها میباشد که درانتظار ارائه یک وظیفه میباشند. وظیفه‌ای که به‌این نخ‌ها انتساب می یابد به طور برابر اعمال شود. ازآنجاکه این وظایف به طور برابر ایفا می شوند، ممکن میباشد بخواهیم مطمئن شویم که کدمان از حیث نخ ایمن میباشد. یک استخر نخ به صورت عمده به حل دو ایراد تحت یاری می‌نماید:

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

در حالتی‌که 40 تصویر BMP داشته باشیم که بخواهیم دیکد کنیم و هر bitmap برای دیکد شدن به 4 میلی‌ثانیه فرصت نیاز داشته باشد. چنانچه این فعالیت را روی یک نخ منفرد اعمال کنیم، در کل 160 میلی‌ثانیه برای دیکد کردن کلیه بیت‌مپ‌ها نیاز داریم. با این هم اکنون در‌حالتی که این فعالیت را با 10 نخ ایفا دهیم، هر مورد چهار بیت‌مپ را دیکد می‌نماید و از این رو فرصت ما یحتاج برای دیکد کردن این 40 بیت‌مپ موازی با صرفا 16 میلی‌ثانیه خواهد بود.

ایراد این میباشد که امور را چه‌طور به هر نخ ارسال کنیم، مجال‌بندی عمل به چه شکل باشد و چه طور این نخ‌ها را رئیس کنیم. این اختلال بسیار بزرگی میباشد. این دقیقاً به عبارتی جایی میباشد که ThreadPoolExecutor وارد فعالیت می‌گردد.

ThreadPoolExecutor چیست؟

ThreadPoolExecutor یک کلاس میباشد که AbstractExecutorService (+) را گسترش می دهد. ThreadPoolExecutor وظیفه نگهداری از کلیه نخ‌ها را بر ذمه دارااست:

وظایف را به نخ‌ها تحویل می دهد.
آنان‌را زنده نگاه میدارد.
نخ‌ها را خاتمه میبخشد.
نحوه عمل ThreadPoolExecutor در پس‌مورد این سیرتکامل میباشد که وظایفی که بایستی ایفا شوند، در صف فعالیت مراقبت می شوند. هر وظیفه در هنگامی که یک نخ در استخر نخ آزاد یا این که جان دار میگردد، از صف عمل به آن نخ انتساب می یابد.

Runnable
Runnable یک اینترفیس میباشد که بایستی از سوی یک کلاس پیاده‌سازی گردد. دفعه‌های این کلاس به خواسته اجرای یک نخ گزینه به کار گیری قرار می گیرند. به ذکر بی آلایش Runnable یک وظیفه یا این که امر میباشد که می بایست اعمال گردد. از این اینترفیس به صورت مکرر برای اجرای کد در نخ‌های متفاوت استعمال میشود.

1Runnable mRunnable = new Runnable() {
2 @Override
3 public void run() {
4 // Do some work
5 }
6};

Executor
Executor نیز یک اینترفیس میباشد که برای جداسازی تحویل یک وظیفه از اجرای وظیفه آیتم به کارگیری قرار میگیرد. غرض آن اجرای یک Runnable میباشد.

1Executor mExecutor = Executors.newSingleThreadExecutor(); mExecutor.execute(mRunnable);

ExecutorService
یک Executor میباشد که به مدیر وظایف ناهمگام می پردازد.

1ExecutorService mExecutorService = Executors.newFixedThreadPool(10); mExecutorService.execute(mRunnable);

ThreadPoolExecutor
ThreadPoolExecutor یک ExecutorService میباشد که وظایف را به نخ استخرها انتساب می دهد. وجود تعداد متعددی نخ در اکثر زمان ها مورد ها چندان بهتر وجود ندارد، چون CPU فقط تعداد مشخصی از نخ‌ها را می تواند به طور برابر انجام نماید. هنگامی که تعداد نخ‌ها از این تعداد تجاوز نماید، CPU می بایست محاسبات پرهزینه‌ای انجام نماید تا درباره ی این که کدام نخ بایستی مطابق حق تقدم انتساب یابد، تصمیم بگیرد.

ما در طی تولید دفعه‌ای از ThreadPoolExecutor میتوانیم تعداد نخ‌های اول و تعداد نخ‌های بیشینه آن را انتخاب کنیم از آن‌جا که توشهِ کاری در استخر نخ متغیر میباشد، تعداد نخ‌های زنده برای تطبیق با این حالت تغییر تحول می یابد. به صورت معمول توصیه میشود که نخ‌ها بر مبنای تعداد هسته‌های جانور اختصاص یابند. این عمل به طور پایین اعمال می‌گردد:

1int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();

نکته: این فرمان لزوماً تعداد حقیقی و واقعی هسته‌های فیزیکی روی دستگاه را رجوع و برگشت نمی‌دهد. ممکن میباشد CPU بعضا هسته‌ها را برای ذخیره باتری غیر فعال کرد‌ه باشد و یا این که گزینه دیگری وجود داشته باشد.

1ThreadPoolExecutor(
2 int corePoolSize, // Initial pool size
3 int maximumPoolSize, // Max pool size
4 long keepAliveTime, // Time idle thread waits before terminating
5 TimeUnit unit // Sets the Time Unit for keepAliveTime
6 BlockingQueue workQueue) // Work Queue

این پارامترها بدین مفهوم می باشند:

corePoolSize – کمینه تعداد نخ‌هایی که در استخر محافظت می گردند. در صدر صفر نخ در استخر وجود دارا‌هستند. البته وقتی که وظایف به صف اضافه می گردند، نخ‌های تازه ساخت‌و‌ساز میگردند. در صورتی تعداد نخ‌های اجرایی از corePoolSize کمتر باشد، Executor همواره ترجیح میدهد که به مکان صف‌بندی، نخ جدیدی بیفزاید.
maximumPoolSize – بیشینه تعداد نخ‌های مجاز در استخر میباشند. در‌حالتی که این مقدار از corePoolSize تجاوز نماید، و تعداد کنونی نخ‌ها گرانقدر‌خیس یا این که موازی با corePoolSize باشد، نخ‌های کاری تازه فقط در حالتی‌که ساخت‌و‌ساز میگردند که صف مالامال باشد.
keepAliveTime – هنگامی که تعداد نخ‌ها گران قدر‌خیس از تعداد هسته‌ها باشد، نخ‌های غیر هسته (اضافی نخ‌های بی کار) معطل وظیفه نو می مانند و در حالتی‌که در طول فرصت انتخاب‌گردیده از سوی این پارامتر وظیفه‌ای اخذ نکنند، خاتمه خواهند یافت.
Unit – واحد هنگامی برای keepAliveTime میباشد.
workQueue – صف کاری میباشد که فقط وظایف runnable را محافظت می‌نماید. این صف بایستی از نوع BlockingQueue (+) باشد.
چه هنگامی از ThreadPoolExecutor به کارگیری کنیم؟
ThreadPoolExecutor یک چارچوب اجرای وظیفه حاذق میباشد. از آن می‌قدرت در طول وجود تعداد بالایی از وظایف که بایستی به طور برابر جاری ساختن شوند استفاده نمود زیرا ThreadPoolExecutor از افزودن وظیفه به صف، کنسل وظیفه و حق تقدم‌بندی وظایف دفاع می‌نماید.

IntentService
IntentService یک زیرکلاس به ارث رسیده از Service میباشد. برای این که IntentService را بشناسیم بایستی آغاز Service را بشناسیم. Service یک کامپوننت بسیار اساسی در نرم افزار‌نویسی اندروید محسوب میشود. بعضی اوقات ممکن میباشد وظیفه‌ای داشته باشیم که می بایست حتی بعداز مسدود شدن نرم افزار نیز ایفا خواهد شد. دراین‌صورت از Service به کار گیری می کنیم. Service قادر است از سوی ()startService اعمال گردیده و با ()stopService متوقف خواهد شد و برای مدتی زمان بر در پس‌قضیه انجام خواهد شد. همینطور یک خدمت را می‌اقتدار با فراخوانی ()stopSelf در درونش کنسل کرد.

به‌دنبال بعضی از متدهای override گردیده که برای اجرای عملیات متعدد موءثر میباشند را می بینید:

()onCreate – صرفا یک توشه فراخوانی گردد تا این که خدمت متوقف گردد.
()onStartCommand – این تابع بعد از ()onCreate برای اول توشه فراخوانی می گردد، البته می تواند مستقیماً هر فرصت که کامپوننتی ()startService را با اینتنت فراخوانی می‌نماید، از توشه دوم به آن‌گاه آیتم فراخوانی قرار گیرد.
()onDestroy – در حین توقف خدمت فراخوانی می گردد.
گردش نرمال یک خدمت به طور تحت میباشد:

onCreate() -> onStartCommand() -> onDestroy()
در صورتی‌که به گفت و گو IntentService بازگردیم، بایستی بگوییم که Service به طور نرمال شروع می شود، یعنی ()startService را از نخ اساسی فراخوانی می کنیم. این خدمت به مکان ()onStartCommand هر اینتنت که در ()onHandleIntent باشد را رئیس می‌نماید. همینطور از یک نخ کاری به کار گیری می‌نماید و هنگامی که عمل نقطه پایان یابد خویش را متوقف می‌نماید. برای به کار گیری از آن بایستی IntentService را توسعه و گسترش داده و ()onHandleIntent را پیاده‌سازی نمایید.

نکته: IntentService روی یک نخ کاری منفرد اعمال میگردد، در حالی که Service روی نخ اساسی اعمال می‌گردد. هر توشه صرفا یک درخواست پردازش میشوند.

IntentService تابع کلیه محدودیت‌های اجرایی پس‌قضیه میباشد که از سوی اندروید 8.0 (سطح API 26) رقم خورده میباشد. در اکثر وقت ها مفاد عالی میباشد از JobIntentService (+) به کار گیری نمایید که در طی انجام روی اندروید 8 و فراتر از job-ها به مکان خدمت‌ها به کار گیری می‌نماید.

بازدید : 135
دوشنبه 2 تير 1404 زمان : 10:31


آپلود پوشه و اکران جلو رفتن آن در کاتلین – از صفر تا صد
در‌حالتی که میخواهید یک پوشه را با به کارگیری از ساختار سرراست Retrofit آپلود نمایید، شاید متوجه گردید که قابلیت و امکان اخذ سود و همینطور اکران نوار جلو رفتن در کاتلین را ندارید. ما درین نوشته‌ی‌علمی از Retrofit برای آپلود فولدر استعمال می کنیم و ساختاری پیاده‌سازی می کنیم که قابلیت و امکان اخذ معیار توسعه و گسترش عمل را در برهه زمانی‌های هنگامی متعدد طراحی اپلیکیشن در مشهد داراست و نهایتاً با کامل شدن جواب API ریموت، ‌نقطه نهایی مییابد.
هر فرصت که عملیاتی بلندمدت در اکنون ایفا میباشد، بهتر میباشد که فرایند جلو رفتن عمل را به مخاطب نماد دهیم. در زمینه ی آپلود فولدر میتوانیم بسط حقیقی و واقعی عمل را که بر حسب بایت‌های جابجایی‌یافته از آحاد اندازه پوشه به حساب آوردن میشود به استفاده کننده علامت دهیم.

درپی از API-های جان دار در کتابخانه‌های Retrofit ،OkHttp و Okio برای تشکیل داد یک کلاس به کار گیری می کنیم که برای اکران فرآیند جلو رفتن آپلود فولدر گزینه به کارگیری قرار میگیرند.
نقطه انتهایی
فرض فرمایید در هم اکنون گسترش یک نرم افزار پیام‌رسانی هستیم که قابلیت و امکان الصاق پوشه به حرفه پیام را دارااست. قابل ذکر میباشد که‌این کامپوننت واکنشی از RxJava به کارگیری می‌نماید، ولی می‌اقتدار از Callback-های بی آلایش یا این که کوروتین‌ها و تابع‌های تعلیقی کاتلین نیز به کار گرفت.

نقطه انتهایی (endpoint) ما یک درخواست POST میباشد که دربرگیرنده بدنه چندبخشی میباشد که از اجزای اسم فولدر، نوع MIME پوشه، ‌اندازه فولدر و خویش فولدر تشکیل یافته میباشد. آن را می توانیم با استعمال از Retrofit و با گزینش قسمت‌های مورد نیاز به روش‌ای همانند کد پایین تعریف و تمجید کنیم:

@Multipart
@POST("file")
fun attachFile(
@Part("name") filename: RequestBody,
@Part("type") mimeType: RequestBody,
@Part("size") fileSize: RequestBody,
@Part filePart: MultipartBody.Part
): Single
شمارش جلو رفتن
درصورتی که تنهاً می‌خواستیم پوشه را سوای اکران مراحل توسعه و گسترش، آپلود کنیم، کافی بود فولدر را به بدنه درخواست تبدیل کنیم و آن را در درخواست خویش بفرستیم.

fun createUploadRequestBody(file: File, mimeType: String) =
file.asRequestBody(mimeType.toMediaType())
رسیدگی بر گسترش آپلود نیز با به کار گیری از CountingRequestBody نتایج میگردد که در پوشه RequestBody جای دارد و تا قبل از اینً استعمال کردیم. داده‌هایی که ارسال میشوند همچون قبلی می باشند و به فولدر ناپخته RequestBody قابلیت و امکان میدهیم که نماینده نوع محتوا و ارتفاع محتوا باشد.

class CountingRequestBody(
private val requestBody: RequestBody,
private val onProgressUpdate: CountingRequestListener
) : RequestBody() {
override fun contentType() = requestBody.contentType()

@Throws(IOException::class)
override fun contentLength() = requestBody.contentLength()

...
}
جابجایی بدنه درخواست با تایپ کردن یک Sink جاری ساختن مییابد و Sink پیش‌فرض را داخل آن Sink قرار میدهیم که بایت‌های انتقالی را می‌شمارد و آنها را از روش یک Callback جلو رفتن رجوع میدهد.

typealias CountingRequestListener = (bytesWritten: Long, contentLength: Long) -> Unit

class CountingSink(
sink: Sink,
private val requestBody: RequestBody,
private val onProgressUpdate: CountingRequestListener
) : ForwardingSink(sink) {
private var bytesWritten = 0L

override fun write(source: Buffer, byteCount: Long) {
super.write(source, byteCount)

bytesWritten += byteCount
onProgressUpdate(bytesWritten, requestBody.contentLength())
}
}
مشاهده بی نقص کدها
داخل CountingRequestBody خواهیم توانست Sink پیش‌فرض را در CountingSink تازه خویش در اختیار بگذاریم و ورژن بافر گردیده‌ی آن را بنویسیم تا هم فولدر جابجایی یابد و هم مراحل جلو رفتن را ببینیم.

class CountingRequestBody(...) : RequestBody() {
...

@Throws(IOException::class)
override fun writeTo(sink: BufferedSink) {
val countingSink = CountingSink(sink, this, onProgressUpdate)
val bufferedSink = countingSink.buffer()

requestBody.writeTo(bufferedSink)

bufferedSink.flush()
}
}
فیض
در طول مشاهده جلو رفتن پروسه آپلود، ‌دو موقعیت وجود داراست یا این که پوشه در اکنون آپلود شدن میباشد و یا این که عمل به اتمام رسیده و از این رو خوب میباشد از یک کلاس مهروموم‌گردیده (sealed) استعمال کنیم. این کلاس قابلیت می دهد که یک نوع بازگشتی CountingRequestResult داشته باشیم و فراخوانی‌کننده‌ها میتوانند هم به‌روزرسانی‌های جلو رفتن به و هم فیض کامل شدن‌گردیده را رئیس نمایند.

sealed class CountingRequestResult {
data class Progress(
val progressFraction: Double
) : CountingRequestResult()

data class Completed(
val result: ResultT
) : CountingRequestResult()
}
اجرای آپلود
در حال حاضر که روشی برای آپلود کردن پوشه و اخذ پروسه جلو رفتن آپلود یافتیم، می توانیم FileUploader خویش را بنویسیم. ساخت‌و‌ساز بدنه درخواست برای درخواست آپلود دربرگیرنده به کارگیری از CountingRequestBody میباشد که جلو رفتن و کامل شدن را به یک PublishSubject گزارش میدهد.

private fun createUploadRequestBody(
file: File,
mimeType: String,
progressEmitter: PublishSubject
): RequestBody {
val fileRequestBody = file.asRequestBody(mimeType.toMediaType())
return CountingRequestBody(fileRequestBody) { bytesWritten, contentLength ->
val progress = 1.0 * bytesWritten / contentLength
progressEmitter.onNext(progress)

if (progress >= 1.0) {
progressEmitter.onComplete()
}
}
}
مشاهده بدون نقص کدها
درخواست آپلود مشمول به کارگیری از تابع Retrofit میباشد که در اولِ نوشته‌ی علمی پیاده‌سازی کردیم و جزئییات پوشه و بدنه ساخت و ساز گردیده درخواست که روند جلو رفتن را گزارش میدهند. تعریف‌و‌تمجید Retrofit و پوسته قسمت‌های درخواست به طرز خاص هر API بستگی دارا‌هستند. درین نوشته‌ی‌علمی ما از یک درخواست به کارگیری می کنیم که مشمول قسمت‌های متنی معمولی مختلفی برای ریزه کاری پوشه میباشد و بعد یک قسمت برای خویش فایلی که قرار میباشد آپلود خواهد شد، ارائه می‌نماید.

private fun createUploadRequest(
filename: String,
file: File,
mimeType: String,
progressEmitter: PublishSubject
): Single {
val requestBody = createUploadRequestBody(file, mimeType, progressEmitter)
return remoteApi.attachFile(
filename = filename.toPlainTextBody(),
mimeType = mimeType.toPlainTextBody(),
fileSize = file.length().toString().toPlainTextBody(),
filePart = MultipartBody.Part.createFormData(
name = "files[]",
filename = filename,
body = requestBody
)
)
}

private fun String.toPlainTextBody() = toRequestBody("text/plain".toMediaType())
مشاهده بی نقص کدها
تابع مهم آپلود ما می تواند همگی این قسمت‌ها را کنار هم قرار داده و یک استریم منفرد ساخت‌و‌ساز نماید. به این ترتیب خواهیم توانست این پروسه را مشاهده کرده و فرآیند جلو رفتن آپلود را نیز در فیض پایانی ببینیم.

fun uploadAttachment(
filename: String, file: File, mimeType: String
): Observable {
val progressEmitter = PublishSubject.create()
val uploadRequest = createUploadRequest(
filename, file, mimeType, progressEmitter
)

val uploadResult = uploadRequest
.map {
CountingRequestResult.Completed(it.result)
}
.toObservable()

val progressResult = progressEmitter
.map {
CountingRequestResult.Progress(it)
}

return progressResult.mergeWith(uploadResult)
}

typealias AttachmentUploadRemoteResult =
CountingRequestResult
مشاهده بی نقص کدها
اینک خواهیم توانست پوشه را به API خویش آپلود کنیم و نما را به طور جلو رفتن‌های درخواست به‌روزرسانی کنیم که برای عملیات وقتگیر برهه زمانی مانند آپلود پوشه‌های حجیم اثر گذار میباشد.

uploader.uploadAttachment(request.filename, request.file, request.mimeType)
.subscribeOn(appRxSchedulers.io)
.observeOn(appRxSchedulers.main)
.subscribeBy(
onError = { error ->
// Display error alert
},
onComplete = {
// Display completed Snackbar
},
onNext = { progress ->
// Update progress bar
}
)
.addTo(disposeBag)
مشاهده بی نقص کدها
حرف نهایی
پژوهش بر گسترش یک درخواست اینترنت ممکن میباشد در طول تلاوت یک Retrofit API چندان بدیهی به لحاظ نرسد، ولی API-های قادر OkHttp و Okio می توانند این فعالیت را به خیر اعمال می دهند. خط مش‌حلی که درین راهنما معرفی کردیم، می تواند برای هر درخواست اینترنت جاری ساختن خواهد شد، زیرا شمارش جلو رفتن را می‌قدرت داخل هر RequestBody که مورد نیاز میباشد در درخواست ارسال خواهد شد قرار اعطا کرد.

تعداد صفحات : 0

درباره ما
موضوعات
آمار سایت
  • کل مطالب : 206
  • کل نظرات : 0
  • افراد آنلاین : 1
  • تعداد اعضا : 0
  • بازدید امروز : 190
  • بازدید کننده امروز : 0
  • باردید دیروز : 0
  • بازدید کننده دیروز : 0
  • گوگل امروز : 0
  • گوگل دیروز : 0
  • بازدید هفته : 191
  • بازدید ماه : 191
  • بازدید سال : 899
  • بازدید کلی : 7389
  • <
    آرشیو
    اطلاعات کاربری
    نام کاربری :
    رمز عبور :
  • فراموشی رمز عبور؟
  • خبر نامه


    معرفی وبلاگ به یک دوست


    ایمیل شما :

    ایمیل دوست شما :



    کدهای اختصاصی