বর্ণনামূলক () কখন ব্যবহার করা হয়?


94

কেউ কি জানেন কখন / কখন এই পার্সলেবলের পদ্ধতিটি বলা হয়?

@Override
public int describeContents() {
    return 0;
}

এটি ওভাররাইড করতে হবে। তবে আমি কি এর সাথে দরকারী কিছু করার কথা বিবেচনা করব?


মনে হচ্ছে কারও ধারণা নেই ..? : - /
— কোডি

উত্তর:


183

Parcelableবলা হয় একটি ধ্রুবক সংজ্ঞায়িত CONTENTS_FILE_DESCRIPTORযা describeContents()বিটমাস্ক রিটার্ন মান তৈরি করতে ব্যবহার করা হয়।

জন্য বর্ণনা CONTENTS_FILE_DESCRIPTORমধ্যে এপিআই সুত্র হল:

বিবরণকন্টেন্টস () এর সাথে ব্যবহারের জন্য বিট মাস্কগুলি: প্রতিটি বিট মার্শাল হয়ে গেলে এমন এক ধরণের অবজেক্টের প্রতিনিধিত্ব করে যার সম্ভাব্য বিশেষ তাত্পর্য রয়েছে।

সত্যিই যার অর্থ: আপনি করা দরকার হয় তাহলে FileDescriptorআপনি / নির্দিষ্ট করতে হবে উচিত Parcelable মধ্যে অবজেক্ট CONTENTS_FILE_DESCRIPTOR) describeContents ফেরত মান (, মানে ওই "হিসেবে বিশেষ বস্তু " (মধ্যে describeContents()এর বিবরণ) তারা সত্যিই বলতে চাইছেন: FileDescriptor।

এই পুরো পার্সেলেবল কার্যকারিতা অসম্পূর্ণ দেখাচ্ছে (পড়ুন: খারাপ ডিজাইন রয়েছে)। ডক্সে আরও একটি অদ্ভুত জিনিস রয়েছে:

পার্সেবল ইন্টারফেস প্রয়োগকারী ক্লাসগুলির CREATOR নামে একটি স্ট্যাটিক ফিল্ডও থাকতে হবে যা পার্সেলেবল প্রয়োগকারী একটি উপাদান reat ক্রিয়েটর ইন্টারফেস

মানব পাঠযোগ্য আকারে সংজ্ঞায়িত বিধি দ্বারা একাধিক উত্তরাধিকার প্রয়োগ? :-)

দেখে মনে হচ্ছে এটি সি ++ প্রোগ্রামার ডিজাইন করেছে Parceableএবং এক পর্যায়ে তিনি বুঝতে পেরেছিলেন: ওহ, অভিশাপ, জাভাতে একাধিক উত্তরাধিকার নেই ... :-)


4
এই বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ। এই টিউটোরিয়ালটি দাবি করে হতাশ হয়ে আমি তোমার উত্তর পেয়েছি দাবি করে যে describeContents()0 টি ফিরে আসার উচিত যখনই এটির "এতে কোনও বিশেষত্ব নেই" । যা আসলে কিছুই ব্যাখ্যা করে না। আপনার ব্যাখ্যা এত পরিষ্কার!
— ওয়েবভিউয়ার

4
@LeoLink android.os.ParcelFileDescriptor
— অগ্নিয়ান

8
এটি একাধিক উত্তরাধিকার সম্পর্কে নয়। আপনি একটি জাভা ইন্টারফেসে একটি স্থির পদ্ধতি সংজ্ঞায়িত করতে পারবেন না, অ্যান্ড্রয়েডে ব্যবহৃত সংস্করণে নয়, তাই এই নির্মাতা ক্ষেত্র।
— আলেক্স এন।

4
@ অ্যান্ড্রয়েড ডেভেলপার আমার মনে হয় "সাধারণ" অ্যাপ্লিকেশন বিকাশে এটি ব্যবহার করা মাতৃসাধ্য নয়। মনে হচ্ছে এটি প্রক্রিয়াগুলির মধ্যে তথ্য পাস করার জন্য কেবল স্থানীয় পদ্ধতি দ্বারা ব্যবহৃত হয়। অনুগ্রহ করে ইনপুটচ্যানেল.জভা (মন্তব্য বর্ণনামূলক শ্রেণি) এবং android_os_Parcel.cpp
— অগ্নিয়ান

4
একমাত্র ব্যবহার CONTENTS_FILE_DESCRIPTOR(আসলে hasFileDescriptors()আমি অ্যান্ড্রয়েড সোর্স কোডে খুঁজে পেতে সক্ষম ছিল পদ্ধতি), নিক্ষেপ হয় IllegalArgumentExceptionমধ্যে ActivityManagerService: একটি বার্তা সঙ্গে "/ ইন্টেন্ট / অপশন বান্ডেল পাস ফাইল বর্ণনাকারী" থেকে "সম্ভব ফাঁস ফাইল বর্ণনাকারী প্রত্যাখ্যান" । আমার বোধগম্যতা এটি সুরক্ষা কারণে (অন্য অ্যাপের অনুমতি ব্যবহার করে)। আমি ভুল হলে শুধরে.
— স্লাভ

8

কেবল দুটি সম্ভাব্য মান, 0 বা CONTENTS_FILE_DESCRIPTOR

আপনি যদি পোলোকে সিরিয়ালাইজ করছেন, এই মানটি সর্বদা 0 হওয়া উচিত, CONTENTS_FILE_DESCRIPTOR পার্সেলফিলিডিস্ক্রিপ্টারের জন্য সংরক্ষিত থাকে , যা * ইউনিক্স সিস্টেমে কোনও ফাইল বর্ণনাকারী (FD) সিরিয়ালাইজ করতে পারে।


1

অ্যান্ড্রয়েড কাঠামো থেকে, এক্টিভিটি ম্যানেজারসেবা.জভাতে একমাত্র ব্যবহার ঘটে:

//ActivityManagerService.java
public int startActivityIntentSender(IApplicationThread caller,
    IntentSender intent, Intent fillInIntent, String resolvedType,
    IBinder resultTo, String resultWho, int requestCode,
    int flagsMask, int flagsValues) {
   // Refuse possible leaked file descriptors
   if (fillInIntent != null && fillInIntent.hasFileDescriptors()) {
       throw new IllegalArgumentException("File descriptors passed in Intent");
   }
   //...
}

ইন্টান্ট.জাভা ফাইলডেস্ক্রিপ্টর () এর বান্ডেল থেকে এসেছে জাজা ফাইলডেস্ক্রিপ্টর ()। এবং বান্ডেলটি এমএম্যাপ (হ্যাশম্যাপ) বা এমপ্যারসেলডডাটা (পার্সেল) এর সমস্ত ডেটা পুনরায় পাঠাবে। আমরা অভিপ্রায়টি নির্ধারণ করব hasফাইসডিসিপেক্টরগুলি () কেবলমাত্র পার্সেল / পার্সেবল বর্ণনামূলক কনটেন্টগুলি () মোড়ানো।

যদিও, সম্ভবত এটি বর্ণনার সামগ্রীগুলির জন্য একমাত্র ব্যবহার (): এটি ইনটেন্ট পাস থেকে ফাইলডেস্ক্রিপ্টর ফিল্টার করতে ব্যবহার করে ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.