পারফরম্যান্সের জন্য নেস্টেড ওজনগুলি খারাপ কেন? বিকল্প?


160

আমি বেশ কয়েকটি লেআউট ফাইল লিখেছি যেখানে আমি layout_weightবিভিন্ন দর্শনের মধ্যে অনুপাত তৈরি করতে অ্যাট্রিবিউটটি ব্যবহার করেছি ।

এক পর্যায়ে, আমি নেস্টেড ওজন সম্পর্কে জঞ্জাল সতর্কতা পেতে শুরু করি।

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

ধন্যবাদ!


উত্তর:


140

নেস্টেড ওজনগুলি পারফরম্যান্সের জন্য খারাপ কারণ:

লেআউট ওজনের জন্য একটি উইজেট দু'বার পরিমাপ করা প্রয়োজন। যখন শূন্য-না-ওজনযুক্ত একটি লিনিয়ারলাউট অন্য শূন্য-ওজন সহ অন্য লিনিয়ারলআউটের ভিতরে বাসা বাঁধে, তখন পরিমাপের সংখ্যা তাত্পর্যপূর্ণভাবে বৃদ্ধি পায় increase

RelativeLayout গুলি ব্যবহার করা এবং নির্দিষ্ট dpi মান ব্যবহার না করেই অন্য দেখার জায়গাগুলি অনুসারে আপনার দৃষ্টিভঙ্গির সমন্বয় করা ভাল ।


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

14
তার সমস্ত শিশুদের লেআউট সঠিকভাবে নিশ্চিত করার জন্য রিলেটিভলআউটকেও দু'বার পরিমাপ করতে হবে, সুতরাং লেআরআলআউটকে লেআউট ওজনের সাথে রিলেটিভলয়েট এ পরিবর্তন করুন পারফরম্যান্সের উন্নতি নাও করতে পারে।
পিয়াসি

আপেক্ষিক লেআউট সবসময় কাজ করে না। যে ক্ষেত্রে আপনার আনুপাতিক উইজেটগুলি তৈরি করা দরকার
আবদুরখমন ২

67

আপডেট: আমরা জানি যে শতাংশ সমর্থন লাইব্রেরিটি এপিআই স্তর 26 থেকে ConstraintLayoutঅবনতিযুক্ত। একই ফ্ল্যাট এক্সএমএল কাঠামো অর্জনের নতুন উপায়।

আপডেট গিথুব প্রকল্প

আপডেট হওয়া নমুনা:

<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/fifty_thirty"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#ffff8800"
        android:gravity="center"
        android:text="@string/fifty_fifty_text"
        android:textColor="@android:color/white"
        app:layout_constraintHeight_default="percent"
        app:layout_constraintHeight_percent="0.5"
        android:textSize="25sp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_default="percent"
        app:layout_constraintWidth_percent="0.5" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#ffff5566"
        android:gravity="center"
        android:text="@string/fifty_fifty_text"
        android:textColor="@android:color/white"
        android:textSize="25sp"
        app:layout_constraintHeight_default="percent"
        app:layout_constraintHeight_percent="0.5"
        app:layout_constraintLeft_toRightOf="@id/fifty_thirty"
        app:layout_constraintTop_toBottomOf="@id/fifty_thirty"
        app:layout_constraintWidth_default="percent"
        app:layout_constraintWidth_percent="0.5" />

</android.support.constraint.ConstraintLayout>

আপডেট: গ্রেট নিউজ অ্যান্ড্রয়েড শতাংশ সমর্থন লাইব্রেরি আমাদের কর্মক্ষমতা এবং নেস্টেড অগোছালো ওজনের সমস্যা সমাধান করেLinearLayout

compile 'com.android.support:percent:23.0.0'

ডেমো এখানে

একই প্রদর্শনের জন্য এই সাধারণ বিন্যাসটি বিবেচনা করুন।

শতাংশ সমর্থন লিবারে ডেমো

<android.support.percent.PercentRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/fifty_huntv"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#ff7acfff"
        android:text="20% - 50%"
        android:textColor="@android:color/white"
        app:layout_heightPercent="20%"
        app:layout_widthPercent="50%" />
    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_toRightOf="@id/fifty_huntv"
        android:background="#ffff5566"
        android:text="80%-50%"
        app:layout_heightPercent="80%"
        app:layout_widthPercent="50%"
        />

</android.support.percent.PercentRelativeLayout>

পারফরম্যান্স LinearLayoutহ্রাসকারী এড়ানো ওজন সহ নেস্টযুক্ত.আসলে দুর্দান্ত দুর্দান্ত !!!।


@ হ্যাঁ হ্যাঁ বিবেচনা করে আমরা ওজন সহ লিনিয়ার লেআউট নেস্ট করেছি।
নীতেশ

3
"এই শ্রেণীটি এপিআই স্তরের 26.0.0-beta1 এ অবমূল্যায়ন করা হয়েছিল Const পরিবর্তে কনস্ট্রেন্টলয়েট এবং সম্পর্কিত লেআউটগুলি ব্যবহার করার বিষয়টি বিবেচনা করুন" " বিকাশকারী.অ্যান্ড্রয়েড
রেফারেন্স

7
আমি কনস্ট্রেন্টলআউট পছন্দ করি না। এটি আমার জন্য স্বজ্ঞাতভাবে আচরণ করে না
কারসন

8
কনস্ট্রেন্টলয়েট আমার পক্ষে এত কঠিন
বার্টকিং

1
অটোলেআউট সীমাবদ্ধতার বিষয়ে আপেল দ্বারা প্রদত্ত ব্যাখ্যাগুলি আরও স্পষ্ট এবং যুক্তিটি যেমন একই, এটি সাহায্য করতে পারে। দুর্ভাগ্যক্রমে আমি আইওএসের '
অটোলআউট

46

আমি মনে করি (এবং আমি সম্ভবত এটির জন্য আগুনে ভেসে যাব), তবে আবার আমি মনে করি আমার ফোনের একটি কোয়াড কোর প্রসেসর রয়েছে প্রতিদ্বন্দ্বী করার জন্য (পুরোপুরি ধ্বংস না করলে) বেশিরভাগ লোকের হোম পিসির।

আমি এই ধরণের হার্ডওয়্যার ক্ষমতা ফোনের ভবিষ্যত বলেও মনে করি।

সুতরাং আমি এই সিদ্ধান্তে পৌঁছেছি যে, যতক্ষণ না আপনি বাসা বাঁধছেন না (এমএইচও-তে কোনও লেআউটটি কখনও কখনও 4 স্তরের গভীর না হওয়া উচিত, এবং যদি আপনি সম্ভবত এটি ভুল করছেন) আপনার ফোনটি কম যত্ন নিতে পারে could ওজন সম্পর্কে।

এমন অনেকগুলি কাজ আপনি করতে পারেন যা পারফরম্যান্সের উপর আরও সুদূরপ্রসারী প্রভাব ফেলবে, তারপরে আপনার প্রসেসরটিকে কিছু অতিরিক্ত গণিত করার বিষয়ে চিন্তিত।

(দয়া করে নোট করুন যে আমি কিছুটা হাস্যকর হয়েছি, এবং তাই এই পোস্টটি থেকে খুব বেশি গুরুত্ব সহকারে কিছু না নেওয়ার জন্য অন্যথায় আপনার ধারণাটি প্রথমে অপ্টিমাইজ করা উচিত এমন আরও কিছু জিনিস রয়েছে, এবং 2-3 স্তরের গভীর ওজন সম্পর্কে উদ্বেগজনকভাবে সহায়তা করছে না) তোমার স্বাস্থ্য)


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

প্রশ্নের নির্দিষ্ট বিন্দুটি ওয়েবে নয় ডিভাইসে প্রক্রিয়াকরণ সম্পর্কে উপলব্ধি করুন, তবে ওপির নির্দিষ্টকরণের চেয়ে বিকাশকারী হিসাবে অগ্রাধিকারগুলি সম্পর্কে আমার সাধারণ বক্তব্য হিসাবে বোঝাচ্ছেন।
মেমডেভোপার

11

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

আইসিএসে (এপিআই স্তর 14) GridLayoutযুক্ত করা হয়েছিল, যা অনেকগুলি বিন্যাসের জন্য সহজ এবং 'ফ্ল্যাট' সমাধানগুলির জন্য আগে ওজন প্রয়োজন যা মঞ্জুরি দেয়। যদি আপনি অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলির জন্য বিকাশ করছেন তবে আপনার ওজন অপসারণ করতে কিছুটা শক্ত সময় লাগবে, তবে সেই RelativeLayoutক্যাবটিতে আপনার বিন্যাসের যতটা সম্ভব চ্যাপ্টা ব্যবহার করা সাধারণত নেস্টেড ওজনকে অনেকটা সরিয়ে দেয়।


9
আমি মনে করি না আপনি GridLayout বা এর সাথে একই ফলাফল অর্জন করতে পারবেন RelativeLayout। উদাহরণস্বরূপ GridLayout: "গ্রিডলাউট ওজনের নীতি হিসাবে ওজন হিসাবে সংজ্ঞায়িত হিসাবে সমর্থন সরবরাহ করে না general সাধারণভাবে, তাই একাধিক উপাদানগুলির মধ্যে অতিরিক্ত স্থান বিতরণের জন্য গ্রিডলাউটটি কনফিগার করা সম্ভব নয়" "
টিম্ম্ম্ম

এপিআই 21-এ শুরু করে গ্রিডলাউটটিতে ওজনের ধারণা যুক্ত করা হয়েছিল। পুরানো অ্যান্ড্রয়েড ডিভাইসগুলি সমর্থন করার জন্য, আপনি v7 সমর্থন লাইব্রেরি থেকে গ্রিডলাউট ব্যবহার করতে পারেন। android.support.v7.widget.GridLayout
Эвансгелист ইভান্সজিস্ট

2

ওজন সহ নেস্টেড লিনিয়ারলআউটগুলি এড়ানোর সহজ সমাধান রয়েছে - কেবল ওয়েটসামের সাথে টেবিলআউট এবং ওয়েস্টসাম সহ নেস্টেড লিনিয়ারলআউট ব্যবহার করুন - টেবিলআউটটিতে লিনিয়ারলআউটের একই বৈশিষ্ট্য রয়েছে (ওরিয়েন্টেশন, ওয়েটসাম, লেআউট_ ওয়েট ইত্যাদি) এবং বার্তাটি দেখায় না - "নেস্টেড ওজনগুলি পারফরম্যান্সের জন্য খারাপ আছে "

উদাহরণ:

 <TableLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:weightSum="1">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.8"/>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.2"
            android:orientation="horizontal"
            android:weightSum="1">


            <ImageView
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="0.4"/>

            <TextView
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="0.6"/>


            </LinearLayout>

    </TableLayout>

1

আমি মনে করি, একমাত্র বিকল্প হ'ল একটি ফাংশন তৈরি করা যা অনারিউম বলা হবে এবং সমস্ত আকার এবং অবস্থান নির্ধারণ করবে। যাইহোক, ওজন অনুসারে আপনি কেবল আকার নির্ধারণ করতে পারেন তবে কোনও প্যাডিং নেই (সুতরাং বিন্যাসগুলি আরও জটিল হয়ে উঠবে), কোনও পাঠ্য আকারের (এটি কোনওভাবে ক্ষতিপূরণ করা অসম্ভব), লাইনের সংখ্যার মতো জিনিসকে ছেড়ে দিন।

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