পার্সেবল ইন্টারফেসটি প্রয়োগ করার সময় কীভাবে একটি বুলিয়ান পড়তে / লিখতে হয়?


404

আমি ArrayList Parcelableকোনও ক্রিয়াকলাপে কাস্টম অবজেক্টের একটি তালিকা ক্রিয়াকলাপ করার জন্য একটি করার চেষ্টা করছি । আমি একটি myObjectListক্লাস লিখতে শুরু করি যা প্রসারিত ArrayList<myObject>এবং বাস্তবায়ন করে Parcelable

কিছু বৈশিষ্ট্যগুলি MyObjectরয়েছে booleanতবে Parcelকোনও পদ্ধতি নেই read/writeBoolean

এই হ্যান্ডেল করার সেরা উপায় কি?


3
কারণ ক্রিয়াকলাপগুলির মধ্যে অবজেক্টটি পাস করার বিষয়ে আমি যে সমস্ত পাঠ করেছি তা সিরিয়ালের পরিবর্তে পার্সেবলের ব্যবহারকে পূর্বনির্ধারণ করে।
গ্রাঙ্ক করুন

10
@ মিস্টারস্কোঙ্ক আপনার আন্তঃঅ্যাক্টিভিটি Serializableযোগাযোগের জন্য ইন্টারফেস ব্যবহার করা উচিত নয় । ইহা ধীরগতি.
অক্টাভিয়ান এ ডামিয়ান

1
@ গ্রাঙ্ক: ঠিক আছে, তবে এটি যথেষ্ট উপযুক্ত তবে যতক্ষণ না ইন্টেন্ট.পুটেক্সট্রা (স্ট্রিং নাম, সিরিয়ালাইজেবল মান) ডক্সে অবচয় হিসাবে চিহ্নিত না করা হয়, যদি এটি আমার জন্য জীবন আরও সহজ করে তোলে তবে আমি এটি ব্যবহার চালিয়ে যেতে পেরে খুশি হব। শুধু একটি ভাবনা.
স্কোনঙ্ক

3
@ অক্সাভিয়ান: তবে এটি প্রতি কেস স্টাডির উপর নির্ভর করে এবং এটি আপেক্ষিক।
স্কোনঙ্ক

2
আমার বিপরীতে, অ্যান্ড্রয়েডের স্থপতি দলটি অলস !!! বুলিয়ান !!!!!!!!
ম্যাটিউস

উত্তর:


942

আমি এখানে এটি কীভাবে করব ...

writeToParcel:

dest.writeByte((byte) (myBoolean ? 1 : 0));     //if myBoolean == true, byte == 1

readFromParcel:

myBoolean = in.readByte() != 0;     //myBoolean == true if byte != 0

38
বাইট ওভার ইনট করার কোনও কারণ নেই। কাস্টের কারণে বাইটটি আরও ভার্জোজ: ডাস্ট.উরাইটইন্ট (মাইবুলিয়ান? 1: 0);
মাইগুয়েল

@ সিপ্লাস মন্তব্যে এতগুলি উপার্জন কেন পেল? 1 বা 0 টি মোটেই "লোড" হয় না। এটি একেবারে কোনও পার্থক্য করে না। এবং কখন থেকে জাভা একটি দুর্বল টাইপযুক্ত ভাষা?
Noone

13
@ সোথার একটি বাইট লিখে কেবল একটি ইনট লিখেছেন:/** * Write a byte value into the parcel at the current dataPosition(), * growing dataCapacity() if needed. */ public final void writeByte(byte val) { writeInt(val); }
ডালাস

3
@ ডালাস কি ডকুমেন্টেশন থেকে? যদি তাই হয় তবে আমার মন্তব্য উপেক্ষা করুন। এপিআইকে এমন একটি ফাংশন থাকতে অস্বচ্ছন্দ বলে মনে হচ্ছে writeByte, তবে আসলে একটি ইনট লিখবে।
sotrh

1
@ সোত্রে এটি একটি সোর্স কোড থেকে অনুলিপি করুন। Android.os.Parcel উত্সটি খুলুন এবং নিজের জন্য দেখুন।
ইয়ারোস্লাভ মাইটকলিক

66

আপনি WritValue পদ্ধতিটি ব্যবহার করতে পারেন । আমার মতে এটি সবচেয়ে সোজা সমাধান।

dst.writeValue( myBool );

এরপরে আপনি এটিকে সহজেই একটি সাধারণ কাস্ট দিয়ে পুনরুদ্ধার করতে পারেন Boolean:

boolean myBool = (Boolean) source.readValue( null );

ফণা অধীনে অ্যান্ড্রয়েড ফ্রেমওয়ার্ক এটি একটি পূর্ণসংখ্যা হিসাবে পরিচালনা করবে:

writeInt( (Boolean) v ? 1 : 0 );

অ্যান্ড্রয়েড উত্সটি "হুডের নীচে" অংশটি দেখায় (l 1219)। যদিও সামান্য সামান্য দক্ষ (পদ্ধতি কল এবং স্যুইচের কারণে) এই পদ্ধতিটি আরও কিছুটা সোজা পড়ে reads
দেশীম

6
এখানে লিখিত কোড সংকলন করবে না। রিডভ্যালুতে একটি শ্রেণি লোডার প্রয়োজন তবে এটি বুলিয়ানদের জন্য প্রয়োজন। এটিতে "বুলিয়ান মাইবুল = (বুলিয়ান) উত্স পড়তে হবে readরেডভ্যালু (নাল);" পর্যালোচকদের যাদের তারা কী করছেন তা জানেন না এবং এই উত্তরে আমার সম্পাদনাটি প্রত্যাখ্যান করেছেন: @ হেমাং, জিপড, ডেভিডআরআর।
মাইগুয়েল

1
@ মিগুয়েল এটি সত্য, এটি ঠিক করেছেন :)
তাইগ ২

15

আপনি এই মত ঘোষণা

 private boolean isSelectionRight;

লেখার

 out.writeInt(isSelectionRight ? 1 : 0);

পড়া

isSelectionRight  = (in.readInt() == 0) ? false : true;

বুলিয়ান ধরণটিকে এমন কিছুতে রূপান্তর করা দরকার যা পার্সেল সমর্থন করে এবং তাই আমরা এটিকে রূপান্তর করতে পারি।


এটি একটি ত্রুটি, বেমানান ধরনের, প্রয়োজনীয় বুলিয়ান অন্তর্নিহিত কারণ?
পল ওকেকে

12

অ্যান্ড্রয়েড স্টুডিও (২.৩ এটিএম ব্যবহার করে) আপনার ক্লাসে পার্সলেবল প্রয়োগ করার পরে, আপনি কেবল নিজের শ্রেণীর নামের উপর দিয়ে আপনার মাউস পয়েন্টারটি ধরে রাখতে পারেন এবং এটি আপনাকে পার্সেবল বাস্তবায়ন যুক্ত করতে বলে:

এখানে চিত্র বর্ণনা লিখুন

চারটি ক্ষেত্র থেকে, এটি নিম্নলিখিত উত্পন্ন করে:

public class YourClass implements Parcelable{

String someString;
int someInt;
boolean someBoolean;
List<String> someList;

protected YourClass(Parcel in) {
    someString = in.readString();
    someInt = in.readInt();
    someBoolean = in.readByte() != 0;
    someList = in.createStringArrayList();
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(someString);
    dest.writeInt(someInt);
    dest.writeByte((byte) (someBoolean ? 1 : 0));
    dest.writeStringList(someList);
}

...

এটি সুবিধাজনক :)
ডিনো টো

8

আমি সাধারণত তাদের একটি অ্যারে এবং কল writeBooleanArrayএবংreadBooleanArray

এটি যদি আপনার একক বুলিয়ান দরকার হয় তবে আপনি এটি করতে পারেন:

parcel.writeBooleanArray(new boolean[] {myBool});

আপনার যখন কয়েকটা বুলিয়ান পার্সেল করা দরকার তখন কি সমস্যার মুখোমুখি হয়েছি ... আমার আছে। আপনি কি আমাকে সাহায্য করতে পারেন> stackoverflow.com/questions/13463727/… । ধন্যবাদ।
রজার এলিয়েন


5

যদি আপনি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করেন তবে পার্সেবল কার্যকর করার সহজ উপায়টি আমি আপনাকে পরামর্শ দিয়েছি।

কেবল ফাইল-> সেটিংস-> প্লাগইনস-> ব্রাউজ করুন সংগ্রহস্থল এবং পার্সেবলের জন্য অনুসন্ধান করুন image ছবিটি দেখুন

এখানে চিত্র বর্ণনা লিখুন এটি স্বয়ংক্রিয়ভাবে পার্সেবল তৈরি করবে।

এটি করার জন্য একটি ওয়েবসাইট রয়েছে। http://www.parcelabler.com/


4

সংক্ষিপ্ত এবং সহজ বাস্তবায়ন Kotlin , nullable সমর্থন:

পার্সেলে পদ্ধতি যুক্ত করুন

fun Parcel.writeBoolean(flag: Boolean?) {
    when(flag) {
        true -> writeInt(1)
        false -> writeInt(0)
        else -> writeInt(-1)
    }
}

fun Parcel.readBoolean(): Boolean? {
    return when(readInt()) {
        1 -> true
        0 -> false
        else -> null
    }
}

এবং এটি ব্যবহার করুন:

parcel.writeBoolean(isUserActive)

parcel.readBoolean()        // For true, false, null
parcel.readBoolean()!!      // For only true and false

@ অলিকাজী আপনি জাভাতে 1 লাইন স্টেটমেন্টে সমর্থন alচ্ছিক প্রকারের সাথে এটি করতে পারবেন না। আপনার 3 টি রাজ্য স্থির করা উচিত। আমার মনে হয় আপনি নালীর কথা ভুলে গেছেন
পাভেল শোরোখভ

@ Comm1x, আইডিই এই সমাধানটি পছন্দ করে না। Super সুপারক্লাস কনস্ট্রাক্টর ডেকে যাওয়ার আগে "রিডবুলিয়ান" অ্যাক্সেস করতে পারবেন না।
অ্যাডাম হুরউইটজ

@ Comm1x আমি সমস্যাটি সমাধান করেছি। কাজ করার জন্য যুক্ত পদ্ধতিগুলি অবশ্যই সহযোগী অবজেক্টের
অ্যাডাম হুরউইটজ

3

আপনি আপনার বুলিয়ান মানগুলি মাস্কিং এবং শিফটিং ব্যবহার করে একটি বাইটে প্যাক করতে পারেন। এটি করার সবচেয়ে কার্যকরী উপায় এটি সম্ভবত তারা আপনার কাছ থেকে প্রত্যাশা করবে।


+1 টি। সত্য, একটি বাইটে মান সংরক্ষণ করা আরও কার্যকর হবে। আপনার ধারণাটি উপস্থাপন করতে আপনি কি আমার প্রশ্ন সম্পাদনা করতে আপত্তি করবেন?
অক্টাভিয়ান এ ডামিয়ান

আপনি পারবেন, তবে আপনি যা লিখেছেন তা আসলে আমার অর্থ নয়। এটি কাজ করবে তবে সবচেয়ে দক্ষ নয়। আপনি 8 বুলিয়ান মুখোশ এবং বুলিয়ান বীজগণিত ব্যবহার করে একটি বাইটে প্যাক করতে পারেন
বহরদ্বীপে 76

বেশিরভাগ ক্ষেত্রেই আমি আপনার সাথে একমত, তবে আমার কাছে এমন মামলা রয়েছে যা সময়ে সময়ে ক্রমবর্ধমান হয় যেখানে আমার তিনটি রাজ্যের প্রয়োজন বুলিয়ান কাজ করবে। যেমন একটি yesচ্ছিক হ্যাঁ / কোনও প্রশ্ন নেই। বুলিয়ান স্পষ্টভাবে নির্দিষ্ট করা হয়েছে কিনা তা জানতে আমার নালীর প্রয়োজন।
চাদ গর্শিং

বাইট ওভার writeByte()writeInt()
ইন্টি

3

এখানে আসল প্রশ্নটি সনাক্ত করা শক্ত। আমার ধারণা, Parcelableইন্টারফেসটি প্রয়োগ করার সময় এটি কীভাবে বুলিয়ানদের সাথে কাজ করবেন ।

মাইওবজেক্টের কয়েকটি বৈশিষ্ট্য বুলিয়ান তবে পার্সেলের কোনও পদ্ধতি পঠন / রাইটিংবুলিয়ান নেই।

আপনাকে মানটি স্ট্রিং বা বাইট হিসাবে সঞ্চয় করতে হবে। আপনি যদি স্ট্রিংয়ের জন্য যান তবে আপনাকে বুলিয়ান মানটি পার্স করার জন্য Stringক্লাসের স্থির পদ্ধতিটি ব্যবহার করতে হবে valueOf()। এটি বাইট শক্তিতে সংরক্ষণের মতো কার্যকর নয়।

String.valueOf(theBoolean);

আপনি যদি বাইটের জন্য যান তবে আপনাকে নিজেই একটি রূপান্তর যুক্তি প্রয়োগ করতে হবে।

byte convBool = -1;
if (theBoolean) {
    convBool = 1;
} else {
    convBool = 0;
}

Parcelঅবজেক্টটি আনমারশিং করার সময় আপনাকে মূল ধরণের রূপান্তরকরণের যত্ন নিতে হবে।


স্ট্রিং ব্যবহার করার কোনও কারণ নেই। বাইট ওভার ইন্ট ব্যবহার করার কোনও কারণ নেই, যেহেতু পার্সেলের writeByte()পদ্ধতিটি সরাসরি কল করে writeInt()। রূপান্তর যুক্তি খুব ভার্জিক। শুধু করুন writeInt(boolean ? 1 : 0)এবংboolean = readInt() != 0
ইয়ারোস্লাভ মাইটকলিক

1

আপনি যদি নিজেরাই এটি করতে চান তবে এই প্রশ্নের ইতিমধ্যে অন্যান্য ব্যক্তিরা যথাযথভাবে উত্তর দিয়েছেন।

আপনি যদি নিম্ন-স্তরের পার্সেলিং কোডটির বেশিরভাগ অংশকেই encapsulate বা লুকিয়ে রাখতে পছন্দ করেন তবে পার্সেবলগুলি পরিচালনা করার সহজ করার জন্য কিছু সময় আগে আমি যে কোডটি লিখেছিলাম সেগুলি ব্যবহার করে আপনি বিবেচনা করতে পারেন

পার্সেলে লেখা যতটা সহজ:

parcelValues(dest, name, maxSpeed, weight, wheels, color, isDriving);

যেখানে রঙ একটি এনাম এবং আইড্রাইভিং হ'ল বুলিয়ান example

পার্সেল থেকে পড়াও খুব বেশি কঠিন নয়:

color = (CarColor)unparcelValue(CarColor.class.getClassLoader());
isDriving = (Boolean)unparcelValue();

আমি প্রকল্পটিতে যুক্ত হওয়া "পার্সেলড্রয়েডএক্সাম্পল "টি একবার দেখুন।

অবশেষে, এটি ক্রিয়েটর আরম্ভকারীকে সংক্ষিপ্ত রাখে:

public static final Parcelable.Creator<Car> CREATOR =
    Parceldroid.getCreatorForClass(Car.class);

জন্য ধন্যবাদ .class.getClassLoader()
শীতলমান্ড

0

অ্যান্ড্রয়েড (এওএসপি) উত্সগুলিতে অনেকগুলি উদাহরণ রয়েছে। উদাহরণস্বরূপ, PackageInfoশ্রেণিতে একটি বুলিয়ান সদস্য রয়েছে requiredForAllUsersএবং এটি ক্রমিকভাবে নিম্নরূপিত:

public void writeToParcel(Parcel dest, int parcelableFlags) {
    ...
    dest.writeInt(requiredForAllUsers ? 1 : 0);
    ...
}

private PackageInfo(Parcel source) {
    ...
    requiredForAllUsers = source.readInt() != 0;
    ...
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.