Omid Zakeri

مدیر انجمن
  • تعداد ارسال ها

    107
  • تاریخ عضویت

  • آخرین بازدید

  • Days Won

    25

Omid Zakeri last won the day on اکتبر 30

Omid Zakeri had the most liked content!

اعتبار در انجمن

65 Excellent

1 دنبال کننده

درباره Omid Zakeri

  • درجه
    توسعه دهنده حرفه ای

آخرین بازدید کنندگان نمایه

620 بازدید کننده نمایه
  1. یکی از جدیدترین تحولات در دنیای اندروید انتشار API Google Places برای Android است. این API جدید به ما دسترسی کامل به پایگاه داده گوگل برای 100 میلیون مکان می دهد. چه چیزی در مورد این API عالی است، برای دریافت داده ها از گوگل، بدون XML، یا تجزیه Json باید در مشتری انجام می شود. تمام تجزیه و تحلیل درخواست و پاسخ توسط سرویس گیرنده API Android Places انجام می شود. این به ما می دهد، بسیاری از روش های جدید راحتی که ما می توانیم به طور مستقیم به داده های API دسترسی داشته باشیم. همه ما باید انجام دهیم این است که از کلید API در پروژه استفاده کنیم. انتشار مکان های آندروید API نه تنها دسترسی به داده ها را ساده تر می کند، بلکه همچنین توسعه دهندگان را از پیگیری طول و عرض جغرافیایی می کند. پیش از این، برای دسترسی به داده های موقعیت مکانی در Android، باید تمام اطلاعات از یک سرویس وب را با عبور از پارامترهای مختلف مانند طول و عرض جغرافیایی به آن بازگردانید. API استفاده شده در آن زمان API Google Maps بود. اما اکنون خوشبختانه هیچ چیز از این نوع باید انجام شود. به عنوان مکان جدید Android API به اندازه کافی قدرتمند برای تشخیص مکان فعلی شما و بازیابی تمام داده های محل به صورت خودکار. API Google Places برای Android دارای شش ویژگی جدید است: Place Picker UI widget. Current Place . Place Autocomplete Place Add . Place Report. Place Details. این قسمت را در قسمت dependencies اضافه کنید: compile 'com.google.android.gms:play-services:8.4.0' manifest 2 3 <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> permissions in the manifest <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> PlacePicker یک ویجت UI جدید است که با Places API معرفی شده است. این ویجت می تواند به شدت تلاش های توسعه را در یک سناریوی که نیاز به انتخاب یک مکان نزدیک را دارد، کاهش دهد. ویجت آندروید PlacePicker، یک نقشه و یک لیست از مکان های نزدیک را نمایش می دهد. با استفاده از این ویجت کاربر می تواند یک مکان را انتخاب کند، جزئیات آن به فعالیت تماس می شود. یکی دیگر از ویژگی های فوق العاده در مورد PlacePicker این است که اجازه می دهد سفارشی سازی هدر ها نیز داشته باشد. برای مثال اگر خواص colorPrimary و colorPrimaryDark را در styles.xml تنظیم کرده باشید. آنها می توانند در رابط کاربری PlacePicker نیز به ارث برده شوند، فقط برای حفظ یکپارچگی در جریان برنامه. سورس برنامه را دانلود کنید و از آن لذت ببرید Good Luck دانلود سورس PlacePicker-master.zip
  2. ویجت یک برنامه ی کوچک و یا یک کنترل از برنامه ی اندروید شما می باشد که در صفحه ی home قرار گرفته است. ویجت ها می توانند به راحتی در دسترس باشند، چرا که به شما اجازه می دهند تا برنامه های مورد علاقه ی خود را روی صفحه home قرار دهید تا به سرعت به آنها دسترسی داشته باشید. احتمالا چند ویجت متداول از جمله ویجت موسیقی، آب و هوا و ساعت، را دیده اید. ویجت ها می توانند انواع مختلفی داشته باشند از قبیل ویجت اطلاعات، ویجت های مجموعه، ویجت های کنترل و ویجت های چندگانه. اندروید یک چارچوب کامل به ما ارائه می دهد تا ویجت های خود را گسترش دهیم. Widget - XML file برای ایجاد یک ویجت کاربردی، ابتدا چیزی که نیاز دارید، شی Object AppWidgetProviderInfo است که شما در یک فایل XML ویجت جداگانه تعریف می کنید. برای انجام این کار، بر روی پروژه خود راست کلیک کرده و یک پوشه جدید به نام xml ایجاد کنید. حالا روی پوشه تازه ایجاد شده راست کلیک کرده و یک فایل XML جدید ایجاد کنید. نوع منبع فایل XML باید به AppWidgetProvider تنظیم شود. در فایل xml برخی از خواص را به صورت زیر تعریف می کنید: <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="146dp" android:updatePeriodMillis="0" android:minHeight="146dp" android:initialLayout="@layout/activity_main"> </appwidget-provider> Widget - Layout file حالا شما باید طرح ویجت خود را در فایل پیش فرض XML خود تعریف کنید. شما می توانید قطعات را برای تولید xml خودکار بکشید. Widget - Java file پس از تعریف طرح، در حال حاضر یک فایل JAVA جدید ایجاد کنید یا از موجود استفاده کنید و آن را با کلاس AppWidgetProvider گسترش دهید و روش بهروزرسانی آن را به صورت زیر تعریف کنید. در روش به روز رسانی، شما باید شیء دو کلاس را که PendingIntent و RemoteViews هستند تعریف کنید. نحو آن : PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.activity_main); Widget - Manifest file شما همچنین باید AppWidgetProvider را در فایل manifest خود به شرح زیر اعلام کنید: <receiver android:name="ExampleAppWidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info" /> </receiver> MainActivity.java package com.example.omidza.myapplication; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.widget.RemoteViews; import android.widget.Toast; public class MainActivity extends AppWidgetProvider{ public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { for(int i=0; i<appWidgetIds.length; i++){ int currentWidgetId = appWidgetIds[i]; String url = "http://www.tutorialspoint.com"; Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setData(Uri.parse(url)); PendingIntent pending = PendingIntent.getActivity(context, 0,intent, 0); RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.activity_main); views.setOnClickPendingIntent(R.id.button, pending); appWidgetManager.updateAppWidget(currentWidgetId,views); Toast.makeText(context, "widget added", Toast.LENGTH_SHORT).show(); } } } res/layout/activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:transitionGroup="true"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point" android:id="@+id/textView" android:layout_centerHorizontal="true" android:textColor="#ff3412ff" android:textSize="35dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Widget" android:id="@+id/button" android:layout_centerHorizontal="true" android:layout_marginTop="61dp" android:layout_below="@+id/textView" /> </RelativeLayout> res/xml/mywidget.xml. <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="146dp" android:updatePeriodMillis="0" android:minHeight="146dp" android:initialLayout="@layout/activity_main"> </appwidget-provider> AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.omidza.myapplication" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name=".MainActivity"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/mywidget"></meta-data> </receiver> </application> </manifest>
  3. نگارش 1.0.0

    42 دانلود

    یکی از عواملی که باعث جلب توجه کاربران به برنامه ای می شود استفاده از انیمیشن های جذاب و چشمگیر است. استفاده از انیمیشن در اندروید به برنامه ها شکل و شمایل حرفه ای می دهد و یکی از فاکتورهای اصلی و مهم در طراحی برنامه هایی با رابط کاربری قوی و یا باصطلاح کاربر پسند (User friendly) استفاده از انیمشین در برنامه های اندرویدی است.کتابخانه Curved-Fab-Reveal یکی از کتابخانه های جذاب به صورت انیمیشن و متریال بسیار زیبا.

    رایگان

  4. مشاهده فایل کتابخانه Curved-Fab-Reveal یکی از عواملی که باعث جلب توجه کاربران به برنامه ای می شود استفاده از انیمیشن های جذاب و چشمگیر است. استفاده از انیمیشن در اندروید به برنامه ها شکل و شمایل حرفه ای می دهد و یکی از فاکتورهای اصلی و مهم در طراحی برنامه هایی با رابط کاربری قوی و یا باصطلاح کاربر پسند (User friendly) استفاده از انیمشین در برنامه های اندرویدی است.کتابخانه Curved-Fab-Reveal یکی از کتابخانه های جذاب به صورت انیمیشن و متریال بسیار زیبا. ارسال کننده Omid Zakeri ارسال ۱۷/۰۹/۲۰ دسته کتابخانه های اندروید  
  5. یکی از عواملی که باعث جلب توجه کاربران به برنامه ای می شود استفاده از انیمیشن های جذاب و چشمگیر است. استفاده از انیمیشن در اندروید به برنامه ها شکل و شمایل حرفه ای می دهد و یکی از فاکتورهای اصلی و مهم در طراحی برنامه هایی با رابط کاربری قوی و یا باصطلاح کاربر پسند (User friendly) استفاده از انیمشین در برنامه های اندرویدی است.کتابخانه Curved-Fab-Reveal یکی از کتابخانه های جذاب به صورت انیمیشن و متریال بسیار زیبا. Curved-Fab-Reveal-Example-master.zip
  6. نگارش 1.0.0

    8 دانلود

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

    رایگان

  7. مشاهده فایل معرفی کتابخانه ShowcaseView کتابخانه (ShowcaseView ) برای برجسته سازی و نمایش بخش های خاص برنامه ها به کاربر با پوشش متمایز و جذاب طراحی شده است. این کتابخانه عالی است برای اشاره به نقاط مورد علاقه برای کاربران، حرکات، و یا موارد مبهم مفید است. ارسال کننده Omid Zakeri ارسال ۱۷/۰۹/۱۸ دسته کتابخانه های اندروید  
  8. متد سازنده ، متدی است هم نام کلاس که در هربار ايجاد نمونه‌اي جديد از آن كلاس، بصورت خودكار فراخواني مي‌گردد.هدف از متد سازنده مقدار دهی کردن اعضای کلاس در زمان ایجاد نمونه ای جدید از کلاس است. متد سازنده همیشه دارای سطح دسترسی public است. متد سازنده هیچ مقداری باز نمی گرداند حتی void هم نیست.اگر کلاسی متد سازنده نداشته باشد جاوا به صورت پیش فرض یک متد سازنده برای آن در نظر می گیرد. استفاده کردن از متد سازنده اجباری نیست.یک کلاس می تواند دارای چندین متد سازنده باشد. مثال1 : class Box { double width; double height; double depth; // This is the constructor for Box. Box() { System.out.println("Constructing Box"); width = 10; height = 10; depth = 10; } double volume() { return width * height * depth; } } class BoxDemo6 { public static void main(String args[]) { Box mybox1 = new Box(); Box mybox2 = new Box(); double vol; vol = mybox1.volume(); System.out.println("Volume is " + vol); vol = mybox2.volume(); System.out.println("Volume is " + vol); } } Output Constructing Box Constructing Box Volume is 1000.0 :مثال ۲ class Box { double width; double height; double depth; // This is the constructor for Box. Box(double w, double h, double d) { width = w; height = h; depth = d; } double volume() { return width * height * depth; } } class BoxDemo7 { public static void main(String args[]) { Box mybox1 = new Box(10, 20, 15); Box mybox2 = new Box(3, 6, 9); double vol; vol = mybox1.volume(); System.out.println("Volume is " + vol); vol = mybox2.volume(); System.out.println("Volume is " + vol); } } Output Volume is 3000.0 Volume is 162.0
  9. access modifier ها مشخص می نمایند که چه اطلاعات و داده هایی از یک کلاس برای کلاسهای دیگر قابل دسترس باشد. برای کلاسها وفیلدهاوConstructor ها و متدها می توان سطح دسترسی تعیین کرد. یکی از ویژگیهای برنامه نویسی شی گرایی کپسوله سازی می باشد که توسط Access Modifier ها قابل پیاده سازی است. انواع access modifier ها: ۱-public ۲-private ۳-default ۴-Protected public: اگر کلاسی public باشد از هر جایی می توان به آن دسترسی داشت. حتی اگر کلاسها درون پکیج های جدا از هم قرار داشته باشند هم باز قابل دسترسی خواهند بود. Private: کلاس ها و فیلد هایی که private هستند نمیتوانند توسط کلاس ها وinterface های دیگر به آنها دسترسی داشت. و فقط درون کلاس تعریف شده قابل دستیابی هستند. Default: اگر از هیچ access modifier ای هنگام تعریف کلاس ها و متد ها استفاده نکنیم جاوا حالتdefault را برای آن در نظر می گیرد که در این حالت این کلاس ها و متدها تنها توسط کلاس هایی که درون همان پکیج هستند قابل دسترسی می باشد.در واقع به این حالت package access modifier هم می گویند. Protected: این حالت همانند default می ماند با این تفاوت که sub class ها (یعنی کلاس هایی که از این کلاس ارث بری کردند)هم می توانند به این کلاس دسترسی داشته باشند. مثال: class Test { int a; // default access public int b; // public access private int c; // private access // methods to access c void setc(int i) { // set c's value c = i; } int getc() { // get c's value return c; } } class AccessTest { public static void main(String args[]) { Test ob = new Test(); // These are OK, a and b may be accessed directly ob.a = 10; ob.b = 20; // This is not OK and will cause an error // ob.c = 100; // Error! // You must access c through its methods ob.setc(100); // OK System.out.println("a, b, and c: " + ob.a + " " + ob.b + " " + ob.getc());class AccessTest { public static void main(String args[]) { Test ob = new Test(); // These are OK, a and b may be accessed directly ob.a = 10; ob.b = 20; // This is not OK and will cause an error // ob.c = 100; // Error! // You must access c through its methods ob.setc(100); // OK System.out.println("a, b, and c: " + ob.a + " " + ob.b + " " + ob.getc()); } } } } نکته :درون این برنامه به دلیل اینکه c به صورت private تعریف شده نمی توان مستقیم به آن دسترسی داشت برای دسترسی به این فیلد باید از متد های setc, getc استفاده نمود. کلمه کلیدی (this): گاهی اوقات متدها نیاز ارجاع به شیئی را دارند که آنها را فعال (ایجاد) کرده است به همین منظواز کلمه کلیدی this در جاوا استفاده می نماییم.با استفاده از this در هر متد می توان به شیء جاری ارجاع نمود.در متدها و متد سازنده (Constructor) از this استفاده می شود. برای درک بهتر موضوع به مثال زیر توجه نمایید: Box(double w, double h, double d) { this.width = w; this.height = h; this.depth = d; }
  10. پایگاه داده SQLite یکی از راه های ذخیره داده های برنامه شما به صورت محلی در اندروید است. در این پایگاه داده من میخوام به شما یک راه ساده تر بهنشان دهم. با استفاده از Sugar ORM . به طور معمول با استفاده از SQLite در اندروید، مقدار زیادی از کد های boilerplate مورد نیاز بوده که زمان قابل توجهی صرف می شود. اما با Sugar ORM، همه ی شما نیاز به یک مدل (Bean) دارید: (Add a new note (save : اضافه کردن Delete note : حذف کردن Modify : تغییرات در ابتدا کتابخانه زیر را اضافه کنید : compile 'com.github.satyan:sugar:1.4' تنظیمات زیر را وارد منیفست کنید: <application android:name="com.orm.SugarApp" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" > … <meta-data android:name="DATABASE" android:value="notes.db" /> <meta-data android:name="VERSION" android:value="1" /> <meta-data android:name="QUERY_LOG" android:value="true" /> <meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.grafixartist.noteapp" /> </application> یک مدل (Bean) کلاس شما نیاز دارید که به صورت زیر باشد : public class Note extends SugarRecord { String title, note; long time; // Default constructor is important! public Note() { } public Note(String title, String note, long time) { this.title = title; this.note = note; this.time = time; } … // Getter setters here } برای Create کردن کد زیر را وارد کنید : Note note = new Note(title, desc, time); note.save(); برای Update کردن کد زیر را وارد کنید : Note note = Note.findById(Note.class, id); note.title = “updated title here"; note.save(); برای Delete کردن کد زیر را وارد کنید : Note note = Note.findById(Note.class, id); note.delete(); برای بدست آوردن فهرست همه لیست ها : List<Note> notes = Note.listAll(Note.class); Query برای این کار 2 راه برای انجام این کار وجود دارد. بیایید مثال را مقایسه کنیم: استفاده از Raw Query : List<Note> notes = Note.findWithQuery(Note.class, "Select * from Note where name = ?", "mynote"); استفاده از Query Builder : Select.from(Note.class) .where(Condition.prop("title").eq("mynote"), Condition.prop("description").eq("notedesc")) .list();
  11. کلاس Java FileInputStream بایت ورودی را از یک فایل دریافت می کند. این برای خواندن داده های بایت گرا (جریان های بایت خام) مانند داده های تصویری، صوتی، تصویری و غیره استفاده می شود. به مثال زیر توجه کنید: public class FileInputStream extends InputStream public class DataStreamExample { public static void main(String args[]){ try{ FileInputStream fin=new FileInputStream("D:\\testout.txt"); int i=fin.read(); System.out.print((char)i); fin.close(); }catch(Exception e){System.out.println(e);} } } توجه: قبل از اجرای کد، یک فایل متنی به نام "testout.txt" لازم است که ایجاد شود. در این فایل ما محتوای زیر را داریم: Welcome to javatpoint. اما خروجی کد بالا: Output: W خب برای خواندن همه ی کاراکترها میتوان از دستور do-while استفاده کرد : import java.io.FileInputStream; public class DataStreamExample { public static void main(String args[]){ try{ FileInputStream fin=new FileInputStream("D:\\testout.txt"); int i=0; while((i=fin.read())!=-1){ System.out.print((char)i); } fin.close(); }catch(Exception e){System.out.println(e);} } } Output: Welcome to javaTpoint
  12. در جاوا، ما کلاسهای استثنائی را مانند کلاس ArithmeticException، ArrayIndexOutOfBoundsException، NullPointerException و غیره تعریف کرده ایم. شرایط خاصی برای این استثنائات تعریف شده و در شرایطی که آنها به طور ضمنی توسط JVM (ماشین مجازی جاوا) استفاده می شوند وجود دارد. آیا می دانید که یک برنامه نویس می تواند یک استثنا جدید ایجاد کند و آن را به صراحت پرتاب کند؟ این استثنا ها به عنوان استثنائات تعیین شده توسط کاربر شناخته می شوند. به منظور استثنائات تعریف شده توسط کاربر، پرتاب کلمه کلیدی مورد استفاده قرار می گیرد. در این آموزش، ما خواهیم دید که چگونه یک استثناء جدید ایجاد کنیم و آن را در یک برنامه با استفاده از کلمه کلیدی پرتاب کنیم. شما همچنین می توانید یک استثناء قبلا تعریف شده ای مانند ArithmeticException، IOException و غیره استفاده کنید. //A void method public void sample() { //Statements //if (somethingWrong) then IOException e = new IOException(); throw e; //More Statements } صدا زدن متد نمونه بالا باید همیشه در یک بلوک امتحان قرار داده شود زیرا یک استثناء چک شده را پرتاب می کند - IOException. به کد زیر دقت کنید: MyClass obj = new MyClass(); try{ obj.sample(); }catch(IOException ioe) { //Your error Message here System.out.println(ioe); } استثنا در جاوا، اجباری از نوع Throwable است. اگر شما سعی می کنید که یک شی را پرتاب کنید، کامپایلر از کامپایل کردن برنامه خود اجتناب می کند و یک خطای کامپایل را نشان می دهد. هر گاه برنامه با یک دستور استثنا مواجه شود، مراحل بعدی اجرا نمی شود. کنترل بلافاصله برای گرفتن بلوک منتقل می شود تا ببینید آیا استثنائت پرتاب شده وجود دارد یا خیر. اگر استثنائی در آن وجود نداشته باشد، بلوک بلوک بعدی برای استثناء بررسی می شود و غیره. اگر هیچ کدام از بلوک های تکرار نشود، استثنائا پرتاب شده است، اما یک پیام استثنایی تولید شده بر روی سیستم روی صفحه نمایش داده می شود، همان چیزی است که ما برای استثنائات غیر دستی مدیریت می کنیم. class ThrowDemo{ public static void main(String args[]){ try{ char array[] = {'a','b','g','j'}; /*I'm displaying the value which does not * exist so this should throw an exception */ System.out.println(array[78]); }catch(ArithmeticException e){ System.out.println("Arithmetic Exception!!"); } } } Output: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 78 at beginnersbook.com.ThrowDemo.main(Details.java:9) از آنجا که استثنای پرتاب شده در بلوک های گیرنده مورد استفاده قرار نگرفت، سیستم تولید شده پیام استثنایی برای این استثنا خاص نمایش داده شد.
  13. در این مثال ما نشان خواهیم داد که چگونه از استثنائی try-catch استفاده کنیم. استثنا یک خطا است که ممکن است در طی اجرای یک برنامه اتفاق بیفتد و نشان می دهد که جریان طبیعی برنامه باید قطع شود. NullPointerException، IOException، ArithmeticException، ArrayIndexOutOfBoundsException، بعضی از موارد دیگر استثنائی است که معمولا دیده می شود. این استثنا ها می توانند توسط برخی از بلوک های کد مورد استفاده قرار گیرند که توسط اظهارات try-catch احاطه شده اند. این بلوک کد، handler استثناء نامیده می شود. همچنین، دستیار استثنا ممکن است به صورت اختیاری شامل بلوک نهایی باشد. مثلا کد زیر دارای خطای تقسیم بر صفر است: public class Testtrycatch1{ public static void main(String args[]){ int data=50/0;//may throw exception System.out.println("rest of the code..."); } } Output: Exception in thread main java.lang.ArithmeticException:/ by zero همانطور که در مثال بالا نشان داده شده است، بقیه کد اجرا نمی شود (در این حالت، بقیه دستور کد ... چاپ نمی شود). بیایید راه حل مشکل بالا را با بلوک try-catch جاوا ببینیم. public class Testtrycatch2{ public static void main(String args[]){ try{ int data=50/0; }catch(ArithmeticException e){System.out.println(e);} System.out.println("rest of the code..."); } } Output: Exception in thread main java.lang.ArithmeticException:/ by zero ...rest of the code حالا، همانطور که در مثال بالا نشان داده شده است، بقیه کد اجرا می شود یعنی بقیه دستور کد ... چاپ می شود.
  14. این کلمه‌ی کلیدی در مبحث thread مطرح می‌شود. وقتی چند thread با یک متغیر (مثلا یک شی) عادی کار می‌کنند، ممکن است آن را cache کنند. یعنی هر thread ای که این متغیر را cache کند، یک نسخه از آن گرفته و با آن کار می‌کند (تغییرات اعمالی بر روی آن توسط یک thread، به سایر thread ها منعکس نمی‌شود) اگر آن متغییر با کلمه‌ی کلیدی volatile تعریف شود، تنها یک نسخه از آن متغیر وجود دارد و تغییراتی که یک thread بر روی آن انجام می‌دهد، بلافاصله در thread های دیگر منعکس می‌شود. public class VolatileTest { private static final Logger LOGGER = MyLoggerFactory.getSimplestLogger(); private static volatile int MY_INT = 0; public static void main(String[] args) { new ChangeListener().start(); new ChangeMaker().start(); } static class ChangeListener extends Thread { @Override public void run() { int local_value = MY_INT; while ( local_value < 5){ if( local_value!= MY_INT){ LOGGER.log(Level.INFO,"Got Change for MY_INT : {0}", MY_INT); local_value= MY_INT; } } } } static class ChangeMaker extends Thread{ @Override public void run() { int local_value = MY_INT; while (MY_INT <5){ LOGGER.log(Level.INFO, "Incrementing MY_INT to {0}", local_value+1); MY_INT = ++local_value; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } } } output با استفاده از volatile ... Incrementing MY_INT to 1 Got Change for MY_INT : 1 Incrementing MY_INT to 2 Got Change for MY_INT : 2 Incrementing MY_INT to 3 Got Change for MY_INT : 3 Incrementing MY_INT to 4 Got Change for MY_INT : 4 Incrementing MY_INT to 5 Got Change for MY_INT : 5 output بدون استفاده از volatile ... Incrementing MY_INT to 1 Incrementing MY_INT to 2 Incrementing MY_INT to 3 Incrementing MY_INT to 4 Incrementing MY_INT to 5 نکته: استفاده از Volatile در برنامه هایی که تنها از یه Thread استفاده می شه کاربردی نداره…
  15. transient چیست؟ برای اینکه یک متغیر در عملیات serialization تبدیل و ارسال نشود آن را با کلمه کلیدی transient تعریف میکنند. عملیات Serialization چیست؟ وقتی قرار است کلاس ها در شبکه فرستاده شوند (مثلا در RMI) داده ها بصورت سریالی از بایت ها ارسال شده و دوباره در مقصد به شکل اول ساخته می شوند. به این عملیات Serialization می گویند و کلاس های مربوطه باید رابط Serializable را پیاده سازی کنند. کاربرد transient در زمینه Serialization می باشد و به این معنی هست که فیلد مورد نظر در عمل Serialization استفاده نشود، فیلد هایی رو transient می کنند که نمی خواهند آن ها را نگهداری کنند یا در انتقال شی ها در شبکه نیازی به انتقال اطلاعات آن ها نیست. مثلا اگر شما وضعیت لحظه ایه یک فرآیند را در یک فیلدی از یک شی نگهداری کنید در موقع ثبت و Serialization ممکن است دوست نداشته باشید آن فیلد را نگهداری کنید چون همیشه در زمان اجرا محاسبه میشود. public class Student implements Serializable{ int id; String name; transient int age;//Now it will not be serialized public Student(int id, String name,int age) { this.id = id; this.name = name; this.age=age; } } class PersistExample{ public static void main(String args[])throws Exception{ Student s1 =new Student(211,"omid",26);//creating object //writing object into file FileOutputStream f=new FileOutputStream("f.txt"); ObjectOutputStream out=new ObjectOutputStream(f); out.writeObject(s1); out.flush(); out.close(); f.close(); System.out.println("success"); } } Output: class DePersist{ public static void main(String args[])throws Exception{ ObjectInputStream in=new ObjectInputStream(new FileInputStream("f.txt")); Student s=(Student)in.readObject(); System.out.println(s.id+" "+s.name+" "+s.age); in.close(); } }