কোনও পরিষেবা থেকে ইউআই থ্রেড হ্যান্ডলার অ্যাক্সেস করা হচ্ছে


90

আমি অ্যান্ড্রয়েডে নতুন কিছু চেষ্টা করছি যার জন্য আমার ইউআই থ্রেডটির হ্যান্ডলারটি অ্যাক্সেস করা দরকার।

আমি নিম্নলিখিত জানি:

  1. ইউআই থ্রেডের নিজস্ব হ্যান্ডলার এবং লুপ রয়েছে
  2. যে কোনও বার্তাটি ইউআই থ্রেডের বার্তার কাতারে রাখা হবে
  3. লুপারটি ইভেন্টটি তুলে ধরে এটি হ্যান্ডলারের কাছে পৌঁছে দেয়
  4. হ্যান্ডলার বার্তাটি পরিচালনা করে এবং স্পিফিক ইভেন্টটি ইউআইতে প্রেরণ করে

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

আমি যদি জানতে পারি যে এটি সম্ভব কিনা। যদি তা হয় তবে দয়া করে কিছু কোড স্নিপেটের পরামর্শ দিন, যাতে আমি এটি চেষ্টা করতে পারি।

শুভেচ্ছা গিরিশ

উত্তর:


179

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

Handler handler = new Handler(Looper.getMainLooper());

তারপরে আপনি মূল (ইউআই) থ্রেডে মৃত্যুদন্ড কার্যকর করার জন্য স্টাফ পোস্ট করতে পারেন:

handler.post(runnable_to_call_from_main_thread);

যদি হ্যান্ডলারটি নিজেই মূল (ইউআই) থ্রেড থেকে তৈরি করা হয় তবে যুক্তিটি ব্রিভিটির জন্য বাদ দেওয়া যেতে পারে:

Handler handler = new Handler();

অ্যান্ড্রয়েড দেব গাইড প্রসেস ও থ্রেড উপর আরও তথ্যের হয়েছে।


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

4
উজ্জ্বল। একটি কবজ মত কাজ করে এবং খুব দরকারী। ধন্যবাদ.
জেআরুন

নিখুঁত ^^ এটি কেবলমাত্র একটি স্ট্রিমিং সার্ভিস থেকে আমার ইউআই আপডেট করার জন্য ব্যবহার করেছে। আমি ধন্যবাদ কি প্রয়োজন!
একটি droid

আপনি কি জানেন যে আমি কোনও হ্যান্ডলারের একটি সিঙ্গলটন উদাহরণ তৈরি করতে পারি এবং প্রতিবার ইউআই থ্রেডে কিছু চালানোর প্রয়োজন তা ব্যবহার করতে পারি?
হ্যালো ওয়ার্ল্ড

আমার ধারণা আমরা কখনই জানতে পারব না
ডেনি

28

Messengerআপনার সাথে সংযুক্ত একটি বস্তু তৈরি করুন Handlerএবং এটিতে পাস Messengerকরুন Service(যেমন Intentঅতিরিক্ত হিসাবে startService()) extra Serviceতারপর একটি পাঠাতে পারেন Messageকরার Handlerমাধ্যমে Messengerএখানে এটি প্রদর্শিত একটি নমুনা অ্যাপ্লিকেশন


এই টিপ জন্য ধন্যবাদ। এটি সহায়ক ছিল। আমার ক্রিয়াকলাপ MyDemo.dispatchTouchEvent (মোশনইভেন্ট) লাইন: 20 ফোন উইন্ডো or DecorView.dispatchTouchEvent (মোশনইভেন্ট) লাইন: 1696 ভিউরুট.হান্ডেলমেসেজ (বার্তা) লাইন: 1658 ভিউরুট (হ্যান্ডলার) বার্তাচাঁচ (হ্যান্ডলার) বার্তা দেখুন। ) লাইন: 99 লুপার.লুপ () লাইন: 123 // ইভেন্ট হ্যান্ডলিং এখানে শুরু হয় ActivityThread.main (স্ট্রিং []) লাইন: 4203 এখানে ভিউরুটটি হ্যান্ডলার ler আমি এই হ্যান্ডলারের রেফারেন্স পেতে চাই ... আমার অ্যাপ্লিকেশন থেকে এটি পাওয়া সম্ভব?
iLikeAndroid

@ iLikeAndroid: আপনি যদি এটি তৈরি না করে থাকেন তবে Handlerআপনি এটি অ্যাক্সেস করতে পারবেন না, আফাইক
কমন্সওয়্যার

ধন্যবাদ. আমি ভিউরুটের একটি উদাহরণ তৈরি করার চেষ্টা করেছি। এটি হ্যান্ডলার ছাড়া কিছুই নয়। এখন আমি এই হ্যান্ডেলারটিতে বার্তা জারি করতে সক্ষম হয়েছি। হ্যান্ডলারটি বার্তাটি পাচ্ছে। তবে ভিউরুটটি সঠিকভাবে আরম্ভ করা হয়নি বলে বার্তাটি প্রক্রিয়া করতে সক্ষম নয়। ভিউরুটে যথাযথ ডেটা শুরু করার জন্য আমাকে ভিউরুট.সেটভিউ () কল করতে হবে। আমি জানতে চাই একটি ডিফল্ট দর্শন বা বেস ভিউ ইত্যাদি আছে, যা আমি আরম্ভ করতে ব্যবহার করতে পারি?
iLikeAndroid

@ iLikeAndroid: ViewRootঅ্যান্ড্রয়েড এসডিকে, এএফএসিটি তে কোনও নেই ।
কমন্সওয়্যার

4
@ হাডেজ 30: ব্যক্তিগতভাবে, আমি আবদ্ধ পরিষেবাগুলি বেশি ব্যবহার করি না। আপনি এখনও Handler/ কে ব্যবহার করতে স্বাগত জানাচ্ছেন Messenger, যদিও আমি ইভেন্ট বাস দিয়ে সমস্তটি প্রতিস্থাপন করেছি (যেমন, গ্রিনরোবটের ইভেন্টবাস)।
কমন্সওয়্যার

4

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

protected void onResume() {
    super.onResume();
    bus.register(this);
}

তারপরে একটি কলব্যাক পদ্ধতি সরবরাহ করুন:

public void onTimeLeftEvent(TimeLeftEvent ev) {
    // process event..
}

এবং তারপরে আপনার পরিষেবা যখন এই জাতীয় বিবৃতি কার্যকর করে:

bus.post(new TimeLeftEvent(340));

সেই পোজো আপনার উপরের ক্রিয়াকলাপ এবং অন্যান্য সমস্ত সাবস্ক্রাইব উপাদানগুলিতে পাঠানো হবে। সহজ এবং মার্জিত।


3

আমি নিম্নলিখিত কোড চেষ্টা করার পরামর্শ দিচ্ছি:

    new Handler(Looper.getMainLooper()).post(() -> {

        //UI THREAD CODE HERE



    });

ওপিকে সহায়তা করার জন্য কিছু অতিরিক্ত ব্যাখ্যা প্রয়োজন।
মোগ

2

আপনি ব্রডকাস্ট রিসিভারের মাধ্যমে মানগুলি পেতে পারেন ...... নিম্নলিখিত হিসাবে প্রথমে নিজের ইন্টেন্টফিল্টারটি তৈরি করুন,

Intent intentFilter=new IntentFilter();
intentFilter.addAction("YOUR_INTENT_FILTER");

তারপরে অভ্যন্তরীণ শ্রেণির ব্রডকাস্টার্সিভারটি তৈরি করুন যেমন,

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    /** Receives the broadcast that has been fired */
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction()=="YOUR_INTENT_FILTER"){
           //HERE YOU WILL GET VALUES FROM BROADCAST THROUGH INTENT EDIT YOUR TEXTVIEW///////////
           String receivedValue=intent.getStringExtra("KEY");
        }
    }
};

এখন আপনার ব্রডকাস্ট রিসিভারটিকে অনুরুপ (যেমন) তে নিবন্ধিত করুন

registerReceiver(broadcastReceiver, intentFilter);

এবং পরিশেষে অনড্রেস্ট্রয়ে () তে ব্রডকাস্ট ব্রাউজ রিসিভারটি নিবন্ধভুক্ত করুন,

unregisterReceiver(broadcastReceiver);

এখন সর্বাধিক গুরুত্বপূর্ণ অংশ ... আপনার মান প্রেরণের দরকার যেখানেই আপনার সম্প্রচারটি চালিত করা প্রয়োজন ..... তাই করুন,

Intent i=new Intent();
i.setAction("YOUR_INTENT_FILTER");
i.putExtra("KEY", "YOUR_VALUE");
sendBroadcast(i);

.... চিয়ার্স :)


1

ইন kotlinনা না কিভাবে আপনি এটা করতে পারেন

আপনি যদি পরিষেবা থেকে টোস্ট বার্তাটি দেখাতে চান তবে বলুন

val handler = Handler(Looper.getMainLooper())
handler.post {
   Toast.makeText(context, "This is my message",Toast.LENGTH_LONG).show()
}

0

সমাধান:

  1. লুপার সহ একটি হ্যান্ডলার তৈরি করুনপ্রধান থ্রেড থেকে : অনুরোধহ্যান্ডলার
  2. একটি তৈরি করুন Handlerসঙ্গে Looperমূল থ্রেড থেকে: responseHandler এবং ওভাররাইডhandleMessage পদ্ধতি
  3. একটি চলমান পোস্ট কার্য করুন
  4. ভিতরে Runnableকার্যের , প্রতিক্রিয়াহ্যান্ডলারের কাছে সেন্ডম্যাসেজ কল করুন
  5. এই sendMessageপ্রতিক্রিয়াহ্যান্ডলারের মধ্যে হ্যান্ডেলমেসেজের ফলাফলের অনুরোধ।
  6. থেকে বৈশিষ্ট্যগুলি পান Messageএবং এটি প্রক্রিয়া করুন, ইউআই আপডেট করুন

কোডের উদাহরণ:

    /* Handler from UI Thread to send request */

    Handler requestHandler = new Handler(Looper.getMainLooper());

     /* Handler from UI Thread to process messages */

    final Handler responseHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {

            /* Processing handleMessage */

            Toast.makeText(MainActivity.this,
                    "Runnable completed with result:"+(String)msg.obj,
                    Toast.LENGTH_LONG)
                    .show();
        }
    };

    for ( int i=0; i<10; i++) {
        Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                   /* Send an Event to UI Thread through message. 
                      Add business logic and prepare message by 
                      replacing example code */

                    String text = "" + (++rId);
                    Message msg = new Message();

                    msg.obj = text.toString();
                    responseHandler.sendMessage(msg);
                    System.out.println(text.toString());

                } catch (Exception err) {
                    err.printStackTrace();
                }
            }
        };
        requestHandler.post(myRunnable);
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.