অ্যান্ড্রয়েড প্রকল্পে থ্রিটেনএবিপি কীভাবে ব্যবহার করবেন


192

আমি এই প্রশ্নটি জিজ্ঞাসা করছি কারণ আমি জাভা এবং অ্যান্ড্রয়েডে নতুন এবং আমি এটি বের করার চেষ্টা করে ঘন্টা চেষ্টা করেছি searched উত্তর সম্পর্কিত উত্তরগুলির সংমিশ্রণ থেকে এসেছিল, তাই আমি বুঝতে পেরেছিলাম যে আমি লড়াই করছি এমন কারও জন্য আমি যা শিখেছি তা নথিভুক্ত করব। উত্তর দেখুন।

আমি অ্যান্ড্রয়েড স্টুডিও ২.১.২ ব্যবহার করছি এবং আমার জাভা সেটআপটি নিম্নলিখিত:

>java -version
> openjdk version "1.8.0_91"
> OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~15.10.1-b14)
> OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)

উত্তর:


192

মনোযোগ দিন: জাভা 8+ এপিআই ডিজুগারিং সমর্থন (অ্যান্ড্রয়েড গ্রেডল প্লাগইন 4.0.0+)

এই লাইব্রেরির ( থ্রিটেনএবিপি ) বিকাশ নিম্নমুখর হচ্ছে। দয়া করে অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.০, জাভা.টাইম * * এ আসবেন এবং আসন্ন মাসগুলিতে এর মূল গ্রন্থাগারটি ডিজুয়ারিং বৈশিষ্ট্যটি বিবেচনা করুন।

অ্যান্ড্রয়েড প্ল্যাটফর্মের যে কোনও সংস্করণে এই ভাষার API গুলি সমর্থন করার জন্য, অ্যান্ড্রয়েড প্লাগইনটি 4.0.0 (বা উচ্চতর) এ আপডেট করুন এবং আপনার মডিউলটির বিল্ড.gradle ফাইলটিতে নিম্নলিখিতগুলি অন্তর্ভুক্ত করুন:

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

  compileOptions {
    // Flag to enable support for the new language APIs
    coreLibraryDesugaringEnabled true
    // Sets Java compatibility to Java 8
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.5'
}

প্রথম আবিষ্কার: আপনাকে জাভা.টাইম , থ্রিটেন-ব্যাকপোর্ট বা জোডা-টাইমের পরিবর্তে থ্রিটেনএবিপি কেন ব্যবহার করতে হবে

এটি একটি নতুন মান নির্ধারণের খুব দীর্ঘ প্রক্রিয়াটির একটি সংক্ষিপ্ত সংস্করণ। এই প্যাকেজগুলির সমস্ত একই জিনিস: জাভা জন্য ভাল, আধুনিক সময় পরিচালনার কার্যকারিতা সরবরাহ করে এমন লাইব্রেরি। পার্থক্যগুলি সূক্ষ্ম তবে গুরুত্বপূর্ণ।

সর্বাধিক সুস্পষ্ট সমাধান java.timeহ'ল বিল্ট-ইন প্যাকেজটি ব্যবহার করা , যেহেতু এটি জাভাতে সময় এবং তারিখগুলি মোকাবেলার জন্য নতুন স্ট্যান্ডার্ড উপায়। এটি জেএসআর 310 এর একটি বাস্তবায়ন , যা জোদা-টাইম লাইব্রেরির উপর ভিত্তি করে সময় পরিচালনার জন্য একটি নতুন মান প্রস্তাব ছিল ।

তবে জাভা 8java.time তে চালু হয়েছিল । মার্শমেলো অবধি অ্যান্ড্রয়েড জাভা on- তে চালিত হয় ("অ্যান্ড্রয়েড এন" জাভা 8 ভাষার বৈশিষ্ট্যগুলি প্রবর্তন করার জন্য প্রথম সংস্করণ)। সুতরাং, যদি না আপনি কেবল অ্যান্ড্রয়েড এন নওগাত এবং তারপরের উপরে লক্ষ্য করে থাকেন তবে আপনি জাভা 8 ভাষার বৈশিষ্ট্যগুলিতে নির্ভর করতে পারবেন না (এটি আসলে 100% সত্য বলে আমি নিশ্চিত নই, তবে এটি আমি এটি বুঝতে পারি)। তাই বাইরে।java.time

পরবর্তী বিকল্পটি জোদা-সময় হতে পারে , যেহেতু জেএসআর 310 জোদা-সময় ভিত্তিক ছিল। যাইহোক, থ্রিটেনএবিপি রিডমি হিসাবে ইঙ্গিত দেয় যে বিভিন্ন কারণে জোদা-টাইম সেরা বিকল্প নয়।

এরপরে থ্রিটেন-ব্যাকপোর্ট , যা জাভা java.timefunction এর জাভা 8 কার্যকারিতার অনেকগুলি (তবে সমস্ত নয়) বোর্ট করে most এটি বেশিরভাগ ব্যবহারের ক্ষেত্রে ঠিক আছে, তবে থ্রিটেনএবিপি রিডমে বর্ণিত হিসাবে এটি অ্যান্ড্রয়েডের সাথে পারফরম্যান্স সংক্রান্ত সমস্যা রয়েছে।

সুতরাং শেষ এবং আপাতদৃষ্টিতে সঠিক বিকল্পটি থ্রিটেনএবিপি

দ্বিতীয় আবিষ্কার: বিল্ড টুলস এবং ডিপেন্ডেন্সি ম্যানেজমেন্ট

যেহেতু একটি প্রোগ্রাম সংকলন - বিশেষত একটি বাহ্যিক গ্রন্থাগারগুলির একগুচ্ছ ব্যবহার করা - জটিল, তাই জাভা প্রক্রিয়াটি পরিচালনা করতে প্রায় অবিচ্ছিন্নভাবে একটি "বিল্ড টুল" ব্যবহার করে। মেক , অ্যাপাচি পিঁপড়া , অ্যাপাচি মাভেন এবং গ্রেডল সমস্ত জাভা প্রোগ্রাম যা জাভা প্রোগ্রামগুলির সাথে ব্যবহৃত হয় ( তুলনা করার জন্য এই পোস্টটি দেখুন ) build আরও উল্লিখিত হিসাবে, গ্রেডল অ্যান্ড্রয়েড প্রকল্পের জন্য নির্বাচিত বিল্ড সরঞ্জাম।

এই বিল্ড সরঞ্জামগুলির মধ্যে নির্ভরতা পরিচালনার অন্তর্ভুক্ত। সেন্টিমাইজড প্যাকেজ সংগ্রহস্থল অন্তর্ভুক্ত করে অ্যাপাচি মাভেন প্রথম বলে মনে হয়। মাভেন মাভেন সেন্ট্রাল রিপোজিটরি চালু করেছিলেন , যা পিএইচপি'র composerপ্যাকেগিস্টের সাথে রুবি এবং gemরুবিজেমস. org এর সাথে রুবি'র সমতুল্য কার্যকারিতা মঞ্জুর করে। অন্য কথায়, ম্যাভেন সেন্ট্রাল রিপোজিটরি হ'ল ম্যাভেন (এবং গ্রেডল) যা প্যাকেজিস্ট সুরকারকে কী - সংস্করণযুক্ত প্যাকেজগুলির জন্য একটি নির্দিষ্ট এবং সুরক্ষিত উত্স।

তৃতীয় আবিষ্কার: গ্রেডল অ্যান্ড্রয়েড প্রকল্পগুলিতে নির্ভরতা পরিচালনা করে

আমার করণীয় তালিকার শীর্ষটি হ'ল এখানে নিখরচায় ই- বুকস সহ গ্রেডল ডক্সটি পড়া । আমি এই সপ্তাহগুলি আগে অ্যান্ড্রয়েড শেখার শুরু করার সময় যদি আমি পড়ে থাকতাম তবে আমি অবশ্যই জানতাম যে গ্রেডল অ্যান্ড্রয়েড প্রকল্পগুলিতে নির্ভরতা পরিচালনা করতে ম্যাভেন সেন্ট্রাল রিপোজিটরি ব্যবহার করতে পারে। তদ্ব্যতীত, হিসাবে বিস্তারিত এই Stackoverflow উত্তর, অ্যান্ড্রয়েড স্টুডিও 0.8.9 থেকে, Gradle ম্যাভেন কেন্দ্রিয় সংগ্রহস্থলের ব্যবহার পরোক্ষভাবে Bintray এর JCenter, যার মানে আপনি রেপো সেট আপ করার জন্য কোনো অতিরিক্ত কনফিগ যা করতে হবে না মাধ্যমে - আপনি শুধু তালিকা নির্ভরতা।

চতুর্থ আবিষ্কার: প্রকল্পের নির্ভরতাগুলি [প্রকল্প দির] / অ্যাপ / বিল্ড.gradle এ তালিকাভুক্ত রয়েছে

আবার, জাভাতে গ্র্যাডল ব্যবহার করার অভিজ্ঞতা যাদের রয়েছে তাদের কাছে স্পষ্ট, তবে এটি বের করতে আমার কিছুটা সময় লেগেছে। আপনি যদি লোকেদের "ওহ, কেবল যোগ করুন compile 'this-or-that.jar'" বা এর মতো অন্য কিছু বলতে দেখেন তবে জেনে নিন যে compileসেই বিল্ড.gradle ফাইলটিতে একটি নির্দেশিকা যা সংকলন-সময় নির্ভরতা নির্দেশ করে। নির্ভরতা ব্যবস্থাপনার সরকারী গ্রেডল পৃষ্ঠাটি এখানে

পঞ্চম আবিষ্কার: থ্রিটেনএবিপি পরিচালনা করেছেন জ্যাক ওয়ার্টন, থ্রিটেন দ্বারা নয়

তবুও অন্য একটি বিষয় আমি খুব বেশি সময় ব্যয় করেছি uring আপনি ম্যাভেন কেন্দ্রীয় ThreeTen জন্য চেহারা থাকে, তাহলে আপনি শুধুমাত্র প্যাকেজ দেখতে পাবেন threetenbpনা threetenabp। আপনি যদি থ্রিটিএনএবিপি-র গিথুব রেপোতে যান , আপনি রেডমেরcompile 'this-or-that' ডাউনলোড বিভাগের অধীনে সেই কুখ্যাত লাইনটি দেখতে পাবেন ।

যখন আমি এই গিথুব রেপোটিকে প্রথম আঘাত করলাম তখন আমি জানতাম না যে এই সংকলন লাইনটি কী বোঝায় এবং আমি এটি আমার টার্মিনালে চালানোর চেষ্টা করেছি (একটি সুস্পষ্ট এবং অনুমানযোগ্য ব্যর্থতার সাথে)। হতাশ হয়ে, আমি বাকিটা খুঁজে বের করার দীর্ঘক্ষণ পরে আমি এটিতে ফিরে আসিনি, এবং অবশেষে বুঝতে পারলাম এটি রেপোর com.jakewharton.threetenabpবিপরীতে, রেপোর দিকে ইঙ্গিত করছে এমন একটি মাভেন রেপো লাইন org.threeten। সে কারণেই আমি ভেবেছিলাম থ্রিটেনএবিপি প্যাকেজটি মাভেন রেপোতে নেই।

সংক্ষিপ্তসার: এটি কাজ করে

এখন এটি বেশ সহজ বলে মনে হচ্ছে। আপনার [project folder]/app/build.gradleফাইলটির বিভাগে implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'লাইন রয়েছে কিনা তা নিশ্চিত করে আপনি একটি অ্যান্ড্রয়েড প্রকল্পে আধুনিক সময় পরিচালনার ক্রিয়াকলাপগুলি পেতে পারেন dependencies:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "me.ahuman.myapp"
        minSdkVersion 11
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support:appcompat-v7:23.4.0'
    implementation 'com.android.support:design:23.4.0'
    implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
}

এটিকে অ্যাপ্লিকেশন শ্রেণিতে যুক্ত করুন:

public class App extends Application {    
    @Override
    public void onCreate() {
        super.onCreate();
        AndroidThreeTen.init(this);
        //...
    }
}

1
মহান পোস্টের জন্য ধন্যবাদ। যাইহোক, আমি আশ্চর্য হয়েছি যে আপনিও জোডটাইমঅ্যান্ড্রয়েডটিকে বিবেচনা করেছেন
বব

@ بابি, আমি জোডাটাইমআন্ড্রয়েড নিয়ে পরীক্ষা-নিরীক্ষা করিনি, তবে কেবলমাত্র আমি এখনই সত্যিকার অর্থে এমন কোনও কিছুতে কাজ করছি না যেটির প্রয়োজন। আমার যা মনে আছে সেগুলি থেকে, java.timeবাস্তবায়নটি ঠিক ছিল (মূলত জোডটাইমের একটি বন্দর) এবং আমি নিশ্চিত যে অন্য এক বা দুই বছরে 90% ব্যবহারকারী নওগাত + এ থাকবেন, এটি এটিকে বিকাশের একটি কার্যকর সমাধান হিসাবে তৈরি করবে।
কয়েল

2
@ بابি, জোডাটাইম মূলত জেএসআর -310 (মূলত একই ছেলেরা দ্বারা তৈরি) এর মত, জেএসআর -310 ব্যতীত কম ডিজাইনের ত্রুটি রয়েছে ( উদাহরণস্বরূপ, এই নিবন্ধটি দেখুন )। [... নীচে অবিরত]
এম

2
মন্তব্যগুলি স্পষ্ট করতে ... জাভা.টাইম ফ্রেমওয়ার্ক ( জেএসআর 310 ) জোদা-সময় প্রকল্পের সরকারী উত্তরসূরি । দুটি প্রকল্পই একই ব্যক্তির নেতৃত্বে, স্টিফেন কোলবর্ন । জোদা-টাইম প্রকল্পটি এখন রক্ষণাবেক্ষণের মোডে রয়েছে, টিমটি জাভা.টাইমে মাইগ্রেশনের পরামর্শ দিচ্ছে।
বেসিল বাউরক

6
নিশ্চিত করুন যে আপনি কল করতে AndroidThreeTen.init(this), উদাহরণস্বরূপ উপরে API ব্যবহার করার আগে onCreate().See ThreeTen-গুলো পুরনো ত্রুটি Android এর উপর - ZoneRulesException: নথিভুক্ত করা কোনো সময় অঞ্চল ডেটা ফাইলগুলির
ওলে ভিভি

5

Kael দ্বারা গৃহীত উত্তর সঠিক। তদতিরিক্ত , আমি কয়েকটি জিনিস উল্লেখ করব এবং জাভা.টাইম কার্যকারিতা প্রাপ্ত করার জন্য একটি চিত্র সরবরাহ করব ।

java.time Android 26+ এ বিল্ট 26

অ্যানড্রয়েড 26 বা তার পরে লক্ষ্যবস্তু করা হলে , আপনি জেএসআর 310 ( জাভা.টাইম ক্লাস) অ্যান্ড্রয়েডের সাথে বান্ডিল পেয়েছেন find থ্রিটেনএবিপি যুক্ত করার দরকার নেই ।

এপিআই প্রায় অভিন্ন

কেবল স্পষ্ট করে বলতে গেলে , অ্যান্ড্রয়েডের জন্য থ্রিটেনএবিপি হ'ল থ্রিটেন-ব্যাকপোর্ট লাইব্রেরির একটি রূপান্তর যা জাভা time টাইমের বেশিরভাগ কার্যকারিতা জাভা 6 এবং জাভা 7 এ নিয়ে আসে । এই ব্যাক-পোর্টটি জাভা.টাইমের সাথে প্রায় অভিন্ন API ভাগ করে

মনে করুন আপনি এখন 26 এরও আগে অ্যান্ড্রয়েডকে টার্গেট করছেন, সুতরাং আপনি থ্রিটেনএবিপি ব্যবহার করুন । পরবর্তীতে, অ্যান্ড্রয়েডের সাথে বান্ডিল করা জাভা.টাইম ক্লাসগুলি ব্যবহার করতে, আপনার শেষ পর্যন্ত অ্যান্ড্রয়েডের আগের সংস্করণগুলির জন্য সমর্থন বাদ দিতে পারে । যখন এটি ঘটে তবে আপনি ছাড়া অন্য আপনার কোডবেস থেকে কয়েকটি মাত্র পরিবর্তন করতে হবে (ক) সুইচিং importবিবৃতি, এবং (খ) আপনাকে যে কোনো কল পরিবর্তন org.threeten.bp.DateTimeUtilsনতুন রূপান্তর পদ্ধতি পুরাতন উত্তরাধিকার তারিখ-সময় শ্রেণীর যোগ করা হয় নি ব্যবহার করবেন ( Date, GregorianCalendar) ।

থেকে রূপান্তরটি প্রক্রিয়া ThreeTenABP করার java.time মসৃণ করা উচিত এবং প্রায় যন্ত্রণাহীন।

কখন কোন কাঠামোটি ব্যবহার করবেন

এখানে তিনটি ফ্রেমওয়ার্ক দেখানো একটি চার্ট রয়েছে এবং কোনটি কোন পরিস্থিতিতে কোনটি ব্যবহার করবেন তা নির্দেশ করে।

আপডেট: অ্যান্ড্রয়েড গ্রেডল প্লাগইন 4.0.০.০+ একটি নতুন চতুর্থ বিকল্প নিয়ে আসে, এপিআই জাভা.টাইম কার্যকারিতার একটি উপসেটটি মূলত পূর্ববর্তী অ্যান্ড্রয়েডে তৈরি না করে উপলভ্য করে তোলে ug কেএল দ্বারা প্রধান উত্তর শীর্ষে দেখুন ।

জাভা বা অ্যান্ড্রয়েডের কোন সংস্করণটি ব্যবহার করবে তা জাভা.টাইম লাইব্রেরির সারণী


জাভা.টাইম সম্পর্কে

Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই ক্লাসগুলি , & , এর মতো সমস্যাযুক্ত পুরানো উত্তরাধিকারের তারিখ-সময়ের ক্লাসগুলিকে সহায়তা করে ।java.util.DateCalendarSimpleDateFormat

আরও জানতে, ওরাকল টিউটোরিয়ালটি দেখুন । এবং অনেক উদাহরণ এবং ব্যাখ্যার জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশনটি জেএসআর 310

Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , মাইগ্রেশনে উপদেশ java.time ক্লাস।

আপনি আপনার ডাটাবেসের সাথে জাভা.টাইম অবজেক্টগুলি সরাসরি বিনিময় করতে পারেন । জেডিবিসি ৪.২ বা তারপরের সাথে অনুগত একটি জেডিবিসি ড্রাইভার ব্যবহার করুন । স্ট্রিংগুলির দরকার নেই, ক্লাসের প্রয়োজন নেই । হাইবারনেট 5 এবং জেপিএ 2.2 সমর্থন জাভা.টাইমjava.sql.*

জাভা.টাইম ক্লাস কোথায় পাবেন?


4

অ্যান্ড্রয়েড স্টুডিওতে আপনার বিল্ড গ্রেডেল ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করুন।

implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'

অ্যাপ্লিকেশন শ্রেণি তৈরি করুন এবং এটি এর মতো সূচনা করুন:

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.