পোস্ট পদ্ধতিটি ঠিক কী করে?


106

আমি খুব অদ্ভুত বৈশিষ্ট্যের মুখোমুখি হয়েছি।

যখন আমি মূল থ্রেড এনিমেশন চালানোর চেষ্টা করছি তখন এটি শুরু হয় না। আমি যখন চালানো অ্যানিমেশন ব্যবহার করে

getView().post(new Runnable() {
            @Override
            public void run() {
                getView().startAnimation(a);
            }
        });

এটা শুরু হয়।

CurrentThreadঅ্যানিমেশন শুরু করার আগে আমি মুদ্রণ করেছি এবং উভয়ই মুদ্রণ করেছি main

স্পষ্টতই, আমি এখানে কিছু মিস করছি, যেহেতু উভয়েরই মূল থ্রেডে অ্যানিমেশনটি শুরু করা উচিত ... আমার ধারণা হ'ল পোস্টটি কাতারে যুক্ত করার সাথে সাথে এটি আরও "সঠিক সময়ে" শুরু হয় তবে আমি জানতে আগ্রহী আরও গভীরতা এখানে কি ঘটে।

সম্পাদনা: আমাকে বিষয়গুলি পরিষ্কার করতে দাও - আমার প্রশ্ন হ'ল পোস্টে অ্যানিমেশনটি কেন শুরু করার কারণ হয়, যখন মূল থ্রেমে অ্যানিমেশনটি শুরু হয় না।


এই আচরণটি কি কোনও অ্যান্ড্রয়েড সংস্করণের সাথে নির্দিষ্ট? আমি এটিকে Android 4.1.2 এ পুনরুত্পাদন করতে পারিনি!
আকডেনিজ

আমি এই আচরণটি অ্যান্ড্রয়েড ২.৩.৩ এ পুনরুত্পাদন করেছি। কিন্তু জন্য AnimationDrawable! সাধারণ Animationউদাহরণ প্রতিটি সেটআপে সফলভাবে অ্যানিমেট করা শুরু করে started ইন AnimationDrawableকেস; আপনি যখন এটিকে শুরু করার চেষ্টা করেন onCreate, সেই মুহুর্তে দেখার সাথে সংযুক্ত না হওয়ার কারণে এটি শুরু হয় না। সুতরাং এটি কোনও থ্রেডিংয়ের সমস্যা নয় AnimationDrawable। সম্ভবত একই জিনিস জন্য প্রযোজ্য Animation? বিকাশকারী.অ্যান্ড্রয়েড.
com

উত্তর:


161

পোস্ট : পোস্টটি রান্নেবলকে বার্তার কাতারে যুক্ত করার কারণ হিসাবে তৈরি করে,

চলমান: কার্যকর করা যেতে পারে এমন একটি আদেশের প্রতিনিধিত্ব করে। প্রায়শই কোনও আলাদা থ্রেডে কোড চালানোর জন্য ব্যবহৃত হত।

রান () : ক্লাসের কোডের সক্রিয় অংশটি কার্যকর করা শুরু করে। এই পদ্ধতিটি ডাকা হয় যখন একটি থ্রেড শুরু হয় যা একটি শ্রেণীর সাথে তৈরি করা হয় যা রান্নেবলকে কার্যকর করে।

getView().post(new Runnable() {

         @Override
         public void run() {
             getView().startAnimation(a);
         }
     });

কোড :getView().startAnimation(a);

আপনার কোডে,

পোস্টের ফলে রান্নেবল ( কোডটি বিভিন্ন থ্রেডে একটি চালানো হবে) বার্তার সারি যুক্ত করে।

সুতরাং ম্যাসেজের কিউ থেকে এটি আনার সময় স্টার্টএনিমেশনটি একটি নতুন থ্রেডে নিক্ষেপ করা হবে

[সম্পাদনা 1]

আমরা ইউআই থ্রেড (মূল থ্রেড) এর পরিবর্তে কেন একটি নতুন থ্রেড ব্যবহার করব?

ইউআই থ্রেড:

  • অ্যাপ্লিকেশন শুরু করা হলে, ইউআই থ্রেড স্বয়ংক্রিয়ভাবে তৈরি হয়

  • এটি যথাযথ উইজেটে ইভেন্ট প্রেরণের দায়িত্বে রয়েছে এবং এর মধ্যে অঙ্কনের ইভেন্টগুলিও অন্তর্ভুক্ত রয়েছে।

  • এটি আপনার সাথে অ্যান্ড্রয়েড উইজেটগুলির সাথে ইন্টারেক্ট করেন এমন থ্রেডও

উদাহরণস্বরূপ, আপনি যদি স্ক্রিনের বোতামটি স্পর্শ করেন তবে ইউআই থ্রেডটি স্পর্শ ইভেন্টটি উইজেটের কাছে প্রেরণ করে যা ফলস্বরূপ তার চাপা স্থিতি নির্ধারণ করে এবং ইভেন্টের সারিতে একটি অকার্যকর অনুরোধ পোস্ট করে। ইউআই থ্রেড অনুরোধটি প্রাপ্য করে এবং উইজেটকে নিজেই পুনরায় চিত্রিত করার জন্য জানিয়ে দেয়।

যদি ব্যবহারকারী কোনও বোতাম চাপায় যা লংওপ্রেশন করবে?

((Button)findViewById(R.id.Button1)).setOnClickListener(           
             new OnClickListener() {        
        @Override
    public void onClick(View v) {
            final Bitmap b = loadImageFromNetwork();
            mImageView.setImageBitmap(b);
}
});

ইউআই জমাট বাঁধে। প্রোগ্রামটি ক্রাশও হতে পারে।

public void onClick(View v) {
  new Thread(new Runnable() {
    public void run() {
        final Bitmap b = loadImageFromNetwork();
        mImageView.setImageBitmap(b);
    }
  }).start();
}

এটি অ্যান্ড্রয়েড নিয়ম ভঙ্গ করে যা কর্মীদের থ্রেড থেকে সরাসরি ইউআই আপডেট করে না

অ্যান্ড্রয়েড অন্যান্য থ্রেড থেকে ইউআই থ্রেড অ্যাক্সেস করার বিভিন্ন উপায় সরবরাহ করে।

  • Activity.runOnUiThread (runnable)
  • View.post (runnable)
  • View.postDelayed (চলমান, দীর্ঘ)
  • ক্রীড়াশিক্ষক

নীচের মত,

View.post (runnable)

public void onClick(View v) {
  new Thread(new Runnable() {
    public void run() {
      final Bitmap b = loadImageFromNetwork();
      mImageView.post(new Runnable() {
        public void run() {
          mImageView.setImageBitmap(b);
        }
      });
    }
  }).start();
}

ক্রীড়াশিক্ষক

final Handler myHandler = new Handler(Looper.getMainLooper());

(new Thread(new Runnable() {

    @Override
    public void run() {
       final Bitmap b = loadImageFromNetwork();
      myHandler.post(new Runnable() {                           

        @Override
        public void run() {
           mImageView.setImageBitmap(b);
          }
        });
      }
    })).start();                
}

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

আরও তথ্যের জন্য

http://android-developers.blogspot.com/2009/05/painless-threading.html

http://www.aviyehuda.com/blog/2010/12/20/android-multithreading-in-a-ui-environment/


15
তাহলে কেন পোস্টে অ্যানিমেশনটি মূল থ্রেডে চালানোর চেয়ে আলাদা যখন তারা উভয়ই একই থ্রেডে চালিত হয়?
গাল

কারণ এই একক থ্রেড মডেলটি অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলিতে খারাপ কর্মক্ষমতা অর্জন করতে পারে yield
তালহা

1
অ্যানিমেশন না দেখানোর সাথে দুর্বল অভিনয়টির কী আছে?
গাল

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

3
সমস্ত ইউআই কাজ মূল থ্রেড (ইউআই থ্রেড) এ থাকা উচিত। সরাসরি মূল থ্রেডের পরিবর্তে পোস্ট () ব্যবহার করে অ্যানিমেশন কাজ করার কৌশলটি হ'ল সময়: আপনি যদি এখনই মূল থ্রেডে কল করেন যার অর্থ আপনি "এখনই অ্যানিমেশন শুরু করুন" বলেছিলেন, তবে এই সময়ে দৃশ্যটি প্রস্তুত নয় অ্যানিমেশন জন্য (পরিমাপ, অঙ্কন ...)। তবে আপনি যদি এটি পোস্টে রাখেন (), এটি আনিমের জন্য প্রস্তুত ভিউয়ের জন্য কিছু সময়ের জন্য প্রারম্ভকালে অ্যানিমেশনটি মুলতুবি থাকবে।
NguyenDat

35

এটি কি অনক্রিট বা অনক্রিটভিউতে করা হচ্ছে? যদি তা হয়, অ্যাপটি উইন্ডোতে ভিউ সংযুক্ত থাকা অবস্থায় থাকতে পারে না। ভিউ মেট্রিকের উপর ভিত্তি করে প্রচুর অ্যালগরিদম কাজ করতে পারে না কারণ ভিউর পরিমাপ এবং অবস্থানের মতো জিনিসগুলি গণনা করা হয়নি। অ্যানড্রয়েড অ্যানিমেশনগুলির সাধারণত তাদের ইউআই গণিতের মধ্যে দিয়ে চলতে হয়

ভিউ.পোস্টটি আসলে বার্তার বার্তার লুপটিতে অ্যানিমেশনটিকে সারি করে তোলে, সুতরাং একবার ভিউ উইন্ডোতে সংযুক্ত হয়ে গেলে এটি অ্যানিমেশনটি নিজে হাতে চালিত না করে সম্পাদন করে।

আপনি আসলে ইউআই থ্রেডে জিনিস চালাচ্ছেন তবে অন্য সময়ে


গৃহীত উত্তরটি বিভ্রান্তিমূলক যেখানে পোস্টারটিতে বলা হয়েছে "পোস্টটি রান্নেবলের কারণ ঘটায় (কোডটি বিভিন্ন থ্রেডে চালানো হবে)"। এটি সঠিক উত্তর "আপনি আসলে ইউআই থ্রেডে জিনিস চালাচ্ছেন তবে ভিন্ন সময়ে" - প্লাস 1
স্মিটি

18

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


31
একটি বৃহত্তর (এবং অত্যন্ত সহায়ক) পার্থক্যটি আমি পেয়েছি দর্শনায় চালানো যায়) পোষ্টটি () বলা হবে যখন ভিউটি প্রথম দেখানো হবে। IE, আপনি ভবিষ্যতের কোনও সময়ে ভিউয়ের মূল্যবৃদ্ধির উপর ভিত্তি করে একটি অ্যানিমেশন শুরু করতে সেট করতে পারেন, অবশেষে এটিকে ভিউয়ের স্তরবিন্যাসে যুক্ত করুন। কোন মুহুর্তে, তারপরে অ্যানিমেশন কার্যকর হবে এবং আপনাকে এটি নিয়ে চিন্তা করতে হবে না।
DeeV

আসলে, হ্যান্ডেল.পোস্ট () সর্বদা মূল থ্রেডে কোনও বার্তা / চালানো যায় না। এটি হ্যান্ডলারটি কীভাবে তৈরি হয় তার উপর নির্ভর করে (এটি একটি আলাদা থ্রেডে লুপারের সাথে যুক্ত হতে পারে)। অন্যদিকে, ভিউ.পস্ট () সর্বদা মূল থ্রেডে চলবে
ইয়ার কুকিলকা

4

আপনি যে পোস্টটি () পদ্ধতিতে কল করছেন সেখানে জীবনচক্র পদ্ধতি হতে পারে বলে আমি মনে করি। আপনি কি এটি অনক্রিট () এ করছেন? যদি তাই হয় তবে ক্রিয়াকলাপের অনারিউম () ডকুমেন্টেশনে আমি কী পেয়েছি তা দেখুন:

সারসংকলন()

আপনার ক্রিয়াকলাপটি ব্যবহারকারীর সাথে আলাপচারিতা শুরু করার জন্য এআইপি লেভেল 1 অকার্যকর অনে রিসিউম () অন রিস্টোরইনস্ট্যান্সস্টেট (বান্ডেল), অন-রিস্টার্ট () বা অনপজ () এর পরে কল করা হয়েছে। এটি অ্যানিমেশনগুলি শুরু করতে , একচেটিয়া-অ্যাক্সেস ডিভাইসগুলি খুলুন (যেমন ক্যামেরা) ইত্যাদি to

https://developer.android.com/reference/android/app/Activity.html#onResume ()

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

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


3
onResume"দৃশ্যটি প্রস্তুত" হওয়ার পরে এটি প্রাথমিকভাবে হওয়ার পরে একাধিকবার বলা যেতে পারে (পর্দা ঘুমিয়ে যায়, ব্যাকস্ট্যাকের দিকে এগিয়ে যাওয়া ক্রিয়াকলাপ ইত্যাদি ...)। যদি ফোন করা হয় onResume, তবে একাধিকবার শুরু হওয়া (পুনরায়) এড়াতে আবহাওয়ার ইতিমধ্যে শুরু করা আবহাওয়ার ট্র্যাক করার জন্য একটি পতাকা প্রয়োজন হতে পারে।
সমিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.