থ্রেডের ভিতরে এমন হ্যান্ডলার তৈরি করতে পারে না যা লোপার.প্রিপার () বলে না


981

নিম্নলিখিত ব্যতিক্রমটির অর্থ কী; আমি কীভাবে এটি ঠিক করতে পারি?

এই কোড:

Toast toast = Toast.makeText(mContext, "Something", Toast.LENGTH_SHORT);

এটি ব্যতিক্রম:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
     at android.os.Handler.<init>(Handler.java:121)
     at android.widget.Toast.<init>(Toast.java:68)
     at android.widget.Toast.makeText(Toast.java:231)

8
এই লাইব্রেরিটি পরীক্ষা করুন compile 'com.shamanland:xdroid-toaster:0.0.5', এটির প্রয়োজন runOnUiThread()বা Contextপরিবর্তনশীল নয়, সমস্ত রুটিন চলে গেছে! শুধু ডাকা Toaster.toast(R.string.my_msg);: এখান উদাহরণ github.com/shamanland/xdroid-toaster-example
Oleksii কে

120
কি নির্বোধ ত্রুটি বার্তা! এটি এতটা সহজ হতে পারে - একটি নন-ইউআই থ্রেড থেকে এটিকে কল করতে পারে না যখন কোনও অ-ইউআই থ্রেড থেকে দর্শনগুলি স্পর্শ করা হয়।
ধীররাজ ভাস্কর

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

@ ওলেক্সি ক্রোপাচভ আপনার উল্লিখিত পাঠাগারটির বাস্তবায়ন রানঅনউইথ্রেড () করার মতোই is
হেলিন ওয়াং 19

হ্যাঁ, তবে এটি একটি খুব দরকারী র‍্যাপার
ওলেকসেই কে।

উত্তর:


696

আপনি এটিকে কর্মী থ্রেড থেকে কল করছেন। Toast.makeText()মূল থ্রেডের মধ্যে থেকেই আপনাকে কল করতে হবে (এবং ইউআইয়ের সাথে সর্বাধিক অন্যান্য ক্রিয়াকলাপগুলি) to উদাহরণস্বরূপ আপনি একটি হ্যান্ডলার ব্যবহার করতে পারেন।

ডকুমেন্টেশনে ইউআই থ্রেডের সাথে যোগাযোগ করে দেখুন । সংক্ষেপে:

// Set this up in the UI thread.

mHandler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message message) {
        // This is where you do your work in the UI thread.
        // Your worker tells you in the message what to do.
    }
};

void workerThread() {
    // And this is how you call it from the worker thread:
    Message message = mHandler.obtainMessage(command, parameter);
    message.sendToTarget();
}

অন্যান্য অপশন:

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

আপনি Activity.runOnUiThread () ব্যবহার করতে পারেন ।


মূল সমস্যাটি সম্পর্কে কী বলা যায় (এটি অ্যালার্টডায়ালগ সম্পর্কে ছিল না)?
ইভান জি

5
ক্লেজি যা বললেন তাতে কেবল আমার দুটি সেন্ট যুক্ত করুন। কোডিং উদাহরণটি নিজের জন্য খণ্ডগুলি বলতে পারে বলে আপনি কী বোঝাতে চেয়েছিলেন (তবে স্বীকৃত) এর একটি সংক্ষিপ্ত প্রদর্শন প্রদান করা ভাল।
সিডিটা

5
একটি সম্পূর্ণ প্রযুক্তিগত উত্তরের জন্য দেখুন এই prasant-paul.blogspot.kr/2013/09/…
টনি 9099

3
জিআইআই সমর্থনকারী প্রায় সকল প্রোগ্রামিং ভাষায় আফাইক, আপনি যদি জিইউআইয়ের সাথে সরাসরি আপডেট / পরিবর্তন / প্রদর্শন / ইন্টারঅ্যাক্ট করেন তবে এটি প্রোগ্রামের মূল থ্রেডে করা উচিত।
আহমেদ

(and most other functions dealing with the UI)ব্যাকগ্রাউন্ড থেকে ব্যবহারযোগ্য একটি ইউআই ফাংশনের উদাহরণ হ'ল android.support.design.widget.Snackbar- ইউআই থ্রেড থেকে কল না করার সময় এর কার্যকারিতা অবিচ্ছিন্ন হয়।
স্ক্রুফি

852

আপনাকে Toast.makeText(...)ইউআই থ্রেড থেকে কল করতে হবে :

activity.runOnUiThread(new Runnable() {
  public void run() {
    Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
  }
});

এটি অন্য (নকল) এসও উত্তর থেকে অনুলিপি করা হয়েছে


13
দুর্দান্ত উত্তর। এটি আমাকে কিছুক্ষণের জন্য বিভ্রান্ত করেছিল। শুধু লক্ষণীয়, আমার ক্রিয়াকলাপের প্রয়োজন ছিল না। রানঅনুথ্রেড আগে।
Cen92

447

আপডেট - 2016

ভাল বিকল্প ব্যবহার করা RxAndroid(জন্য নির্দিষ্ট বাইন্ডিং RxJavaজন্য) Pমধ্যে MVPচার্জ তথ্য ফো নিতে।

Observableআপনার বিদ্যমান পদ্ধতি থেকে ফিরে শুরু করুন ।

private Observable<PojoObject> getObservableItems() {
    return Observable.create(subscriber -> {

        for (PojoObject pojoObject: pojoObjects) {
            subscriber.onNext(pojoObject);
        }
        subscriber.onCompleted();
    });
}

এটি পর্যবেক্ষণযোগ্য এর মতো ব্যবহার করুন -

getObservableItems().
subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread()).
subscribe(new Observer<PojoObject> () {
    @Override
    public void onCompleted() {
        // Print Toast on completion
    }

    @Override
    public void onError(Throwable e) {}

    @Override
    public void onNext(PojoObject pojoObject) {
        // Show Progress
    }
});
}

-------------------------------------------------- -------------------------------------------------- ------------------------------

আমি জানি আমি কিছুটা দেরি করেছি তবে এখানে চলে গেছে। অ্যান্ড্রয়েড মূলত ইউআই থ্রেড এবং ব্যাকগ্রাউন্ড থ্রেড দুটি থ্রেডের উপর কাজ করে । অ্যান্ড্রয়েড ডকুমেন্টেশন অনুযায়ী -

এই সমস্যাটি সমাধানের জন্য ইউআই থ্রেডের বাইরে থেকে অ্যান্ড্রয়েড ইউআই টুলকিট অ্যাক্সেস করবেন না, অ্যান্ড্রয়েড অন্যান্য থ্রেড থেকে ইউআই থ্রেড অ্যাক্সেস করার বিভিন্ন উপায় সরবরাহ করে। এখানে সাহায্য করতে পারে এমন পদ্ধতির একটি তালিকা এখানে রয়েছে:

Activity.runOnUiThread(Runnable)  
View.post(Runnable)  
View.postDelayed(Runnable, long)

এখন এই সমস্যা সমাধানের জন্য বিভিন্ন পদ্ধতি রয়েছে।

আমি কোড নমুনা দ্বারা এটি ব্যাখ্যা করব:

runOnUiThread

new Thread()
{
    public void run()
    {
        myactivity.this.runOnUiThread(new Runnable()
        {
            public void run()
            {
                //Do your UI operations like dialog opening or Toast here
            }
        });
    }
}.start();

LOOPER

ক্লাস কোনও থ্রেডের জন্য একটি বার্তা লুপ ব্যবহার করত। ডিফল্টরূপে থ্রেডগুলির সাথে একটি বার্তা লুপ থাকে না; একটি তৈরি করতে, লুপটি চালানোর জন্য থ্রেডে প্রস্তুত () কল করুন এবং তারপরে লুপটি থামানো অবধি বার্তাগুলি প্রক্রিয়া করার জন্য লুপ () করুন।

class LooperThread extends Thread {
    public Handler mHandler;

    public void run() {
        Looper.prepare();

        mHandler = new Handler() {
            public void handleMessage(Message msg) {
                // process incoming messages here
            }
        };

        Looper.loop();
    }
}

AsyncTask

অ্যাসিঙ্কটাস্ক আপনাকে আপনার ইউজার ইন্টারফেসে অ্যাসিক্রোনাস কাজ সম্পাদন করতে দেয়। এটি কোনও কর্মী থ্রেডে ব্লকিং অপারেশনগুলি সম্পাদন করে এবং তারপরে ইউআর থ্রেডে ফলাফলগুলি প্রকাশ করে, আপনাকে নিজেরাই থ্রেড এবং / অথবা হ্যান্ডলারগুলি পরিচালনা করার প্রয়োজন ছাড়াই।

public void onClick(View v) {
    new CustomTask().execute((Void[])null);
}


private class CustomTask extends AsyncTask<Void, Void, Void> {

    protected Void doInBackground(Void... param) {
        //Do some work
        return null;
    }

    protected void onPostExecute(Void param) {
        //Print Toast or open dialog
    }
}

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

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

Message msg = new Message();


new Thread()
{
    public void run()
    {
        msg.arg1=1;
        handler.sendMessage(msg);
    }
}.start();



Handler handler = new Handler(new Handler.Callback() {

    @Override
    public boolean handleMessage(Message msg) {
        if(msg.arg1==1)
        {
            //Print Toast or open dialog        
        }
        return false;
    }
});

7
আমি ঠিক এটিই খুঁজছিলাম। বিশেষ করে প্রথম উদাহরণটিrunOnUiThread
নবীন

5
ধন্যবাদ, অ্যান্ড্রয়েড প্রোগ্রামিং 5 বছর এবং আমি জানতাম না Viewএছাড়াও পদ্ধতি আছে post(Runnable)এবং postDelayed(Runnable, long)! নিরর্থক অনেক হ্যান্ডলার। :)
ফেনিক্স ভোল্ট্রেস

যারা হ্যান্ডলারের উদাহরণ দ্বারা বিভ্রান্ত হয়েছেন তাদের জন্য: "নতুন হ্যান্ডলার (কলব্যাক)" বাঁধাই করা থ্রেডটি কী? এটি থ্রেডের সাথে আবদ্ধ যা হ্যান্ডলারটি তৈরি করেছে।
হেলিন ওয়াং

1
কেন এটি সেরা বিকল্প ?
ইগোরগানাপলস্কি

আমি doInBackground এবং আমি একটি অ্যারেলিস্ট ফিরে পেতে চাই তবে আমি সর্বদা ত্রুটিটি পাই: থ্রেডের ভিতরে হ্যান্ডলার তৈরি করতে পারি না যা লোপার.প্রিপারে () নামে ডাকে না। দেখুন এটি আমার প্রশ্ন stackoverflow.com/questions/45562615/… তবে আমি এই উত্তরটি থেকে এখানে সমাধান পেতে পারি না
ওয়েস্ট

120

Toast.makeText()কেবল মেইন / ইউআই থ্রেড থেকে কল করা উচিত। Looper.getMainLooper () আপনাকে এটি অর্জনে সহায়তা করে:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        Toast toast = Toast.makeText(mContext, "Something", Toast.LENGTH_SHORT);
    }
});

এই পদ্ধতির একটি সুবিধা হ'ল আপনি এটিকে ক্রিয়াকলাপ বা প্রসঙ্গ ছাড়াই ব্যবহার করতে পারেন।


2
ধন্যবাদ অন্যান্য উত্তর আমার জন্য কাজ করে না। অধ্যবসায় পরিচালনা করতে আমি একটি লাইব্রেরি চিনির রেকর্ড ব্যবহার করছি। এবং এটির ভিতরে আমার ক্রিয়াকলাপ নেই। তবে এটি আশ্চর্যজনকভাবে কাজ করে
ক্যাবিজি 99

91

হ্যান্ডলারের আগে প্রস্তুত নয় লোপারের কারণে রানটাইম এক্সেক্সপশন দেখলে এটি চেষ্টা করুন।

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

handler.postDelayed(new Runnable() {
  @Override
  public void run() {
  // Run your task here
  }
}, 1000 );

হ্যান্ডলার একটি বিমূর্ত ক্লাস। এটি সংকলন করে না
স্টিলথ রাব্বি

2
@ স্টেথাল্যাব্বি সঠিক নামস্থান থেকে হ্যান্ডলার আমদানি করুনandroid.os.Handler
নাইটফুরি

এটি সমস্যা হতে পারে না। কলিং ক্লাস, পিরিয়ড থেকে কোনও লুপের অস্তিত্ব থাকতে পারে।
ইগোরগানাপলস্কি

42

আমি একই সমস্যার মধ্যে দৌড়েছি, এবং এখানেই আমি এটি ঠিক করেছি:

private final class UIHandler extends Handler
{
    public static final int DISPLAY_UI_TOAST = 0;
    public static final int DISPLAY_UI_DIALOG = 1;

    public UIHandler(Looper looper)
    {
        super(looper);
    }

    @Override
    public void handleMessage(Message msg)
    {
        switch(msg.what)
        {
        case UIHandler.DISPLAY_UI_TOAST:
        {
            Context context = getApplicationContext();
            Toast t = Toast.makeText(context, (String)msg.obj, Toast.LENGTH_LONG);
            t.show();
        }
        case UIHandler.DISPLAY_UI_DIALOG:
            //TBD
        default:
            break;
        }
    }
}

protected void handleUIRequest(String message)
{
    Message msg = uiHandler.obtainMessage(UIHandler.DISPLAY_UI_TOAST);
    msg.obj = message;
    uiHandler.sendMessage(msg);
}

ইউআইহ্যান্ডলার তৈরি করতে আপনাকে নিম্নলিখিতগুলি সম্পাদন করতে হবে:

    HandlerThread uiThread = new HandlerThread("UIHandler");
    uiThread.start();
    uiHandler = new UIHandler((HandlerThread) uiThread.getLooper());

আশাকরি এটা সাহায্য করবে.


আমি আপনার কোডটি ব্যবহার করার চেষ্টা করেছি কিন্তু আমি হারিয়েছি এবং onCreate methodআমার পরিস্থিতিতে অ্যাসিঙ্কটাস্কের কাছ থেকে বা কীভাবে কল করবেন তা নিশ্চিত নন আপনি কীভাবে কাজ করে তা শিখতে আপনি দয়া করে পুরো কোডটি পোস্ট করবেন?
নিক কাহন

2
চূড়ান্ত লাইন পড়া উচিত নয় uiHandler = new UIHandler(uiThread.getLooper()); ?
বিয়ার মি

36

ত্রুটির কারণ:

কর্মী থ্রেডগুলি ব্যাকগ্রাউন্ড কাজগুলি করার জন্য বোঝানো হয় এবং আপনি রানওনউইথ্রেডের মতো পদ্ধতিটি কল না করলে আপনি কোনও কর্মী থ্রেডের মধ্যে ইউআই-তে কিছু প্রদর্শন করতে পারবেন না । আপনি রানঅনউইথ্রেডকে কল না করে যদি ইউআই থ্রেডে কিছু দেখানোর চেষ্টা করেন তবে একটি থাকবে java.lang.RuntimeException

সুতরাং, আপনি যদি কর্মী থ্রেড থেকে activityকল করেও থাকেন তবে Toast.makeText()এটি করুন:

runOnUiThread(new Runnable() 
{
   public void run() 
   {
      Toast toast = Toast.makeText(getApplicationContext(), "Something", Toast.LENGTH_SHORT).show();    
   }
}); 

উপরের কোডটি নিশ্চিত করে যে আপনি টোস্ট বার্তাটি প্রদর্শন করছেন UI threadযেহেতু আপনি এটিকে অভ্যন্তরীণ runOnUiThreadপদ্ধতিতে কল করছেন । তাই আর নেই java.lang.RuntimeException


23

এটাই আমি করেছি।

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        Toast(...);
    }
});

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


আমি এই একই পদ্ধতি ব্যবহার করেছি। যাইহোক, এটি কি এই ফাঁসের সম্ভাবনাটি উন্মুক্ত করে, কারণ রান্নেবলের অনামী বেনাম শ্রেণীর ক্রিয়াকলাপের একটি অন্তর্নিহিত রেফারেন্স রাখবে?
পিটার জি উইলিয়ামস

1
এটি একটি সূক্ষ্ম বিষয় :) নিরাপদ দিকে থাকার জন্য কেবল getApplicationContext () বা এর মতো কিছু ব্যবহার করুন।
ইরান

22

আমি নিম্নলিখিতটি না করা পর্যন্ত আমি এই ত্রুটিটি পাচ্ছিলাম।

public void somethingHappened(final Context context)
{
    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(
        new Runnable()
        {
            @Override
            public void run()
            {
                Toast.makeText(context, "Something happened.", Toast.LENGTH_SHORT).show();
            }
        }
    );
}

এবং এটি একটি সিঙ্গলটন শ্রেণিতে পরিণত করেছে:

public enum Toaster {
    INSTANCE;

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

    public void postMessage(final String message) {
        handler.post(
            new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(ApplicationHolder.INSTANCE.getCustomApplication(), message, Toast.LENGTH_SHORT)
                        .show();
                }
            }
        );
    }

}

টোস্টার আপনি কোথায় ব্যবহার করছেন ? আপনার প্রথম স্নিপেটে এটি ব্যবহৃত হয় না ...
ইগোরগানাপলস্কি

1
এটি আমার মতো সুবিধার ক্লাসটি ছিল Toaster.INSTANCE.postMessage(ResourceUtils.getString(R.string.blah));(আমি জানি দীর্ঘতর! আমরা এটি পরে কমিয়ে দিয়েছি), যদিও আমি কিছুক্ষণের মধ্যে
টোস্টগুলি

সুতরাং ApplicationHolder.INSTANCEমূল্যায়ন কি ?
ইগোরগানাপলস্কি

প্রক্রিয়াটি বিদ্যমান থাকাকালীন অ্যাপ্লিকেশনটি সর্বদা উপস্থিত থাকা বিবেচনা করে একটি স্থিতিশীল ভেরিয়েবল CustomApplicationসেট করা CustomApplication.onCreate()থাকে, বিশ্বব্যাপী এই প্রসঙ্গটি ব্যবহার করা যেতে পারে
এপিকপান্ডাফোরস

11
 runOnUiThread(new Runnable() {
            public void run() {
                Toast.makeText(mContext, "Message", Toast.LENGTH_SHORT).show();
            }
        });

2
এটি আমার জন্য কাজ করেছে এবং আমি ল্যাম্বডা ব্যবহার করিrunOnUiThread(() -> { Toast toast = Toast.makeText(getApplicationContext(), "Message", Toast.LENGTH_SHORT); toast.show(); });
কালো_জর্গ


9

এটি কারণ টোস্ট.মেকটেক্সট () কর্মী থ্রেড থেকে কল করছে। এটির মতো মূল ইউআই থ্রেড থেকে কল করা উচিত

runOnUiThread(new Runnable() {
      public void run() {
        Toast toast = Toast.makeText(mContext, "Something", Toast.LENGTH_SHORT);
      }
 });

8

চিকোবার্ডের উত্তর আমার পক্ষে কাজ করেছিল। আমার একমাত্র পরিবর্তনটি হয়েছিল ইউআইহ্যান্ডলার তৈরিতে যেখানে আমাকে করতে হয়েছিল to

HandlerThread uiThread = new HandlerThread("UIHandler");

গ্রহণ অন্য কিছু গ্রহণ করতে অস্বীকার করেছে। আমি মনে করি বোঝায়।

এছাড়াও এটি uiHandlerকোথাও পরিষ্কারভাবে শ্রেণীবদ্ধভাবে সংজ্ঞায়িত। অ্যান্ড্রয়েড কীভাবে এটি করছে এবং কী চলছে তা বোঝার জন্য আমি এখনও দাবি করি না তবে আমি আনন্দিত যে এটি কাজ করে। এখন আমি এটি অধ্যয়ন করতে এগিয়ে যাব এবং আমি কী বুঝতে পারি যে অ্যান্ড্রয়েড কী করছে এবং কেন এই সমস্ত হুপস এবং লুপগুলির মধ্য দিয়ে যেতে হবে understand চিকোবার্ড সাহায্যের জন্য ধন্যবাদ।


6

প্রথম কল Looper.prepare()এবং তারপরে Toast.makeText().show()শেষ কলটি কল করুন Looper.loop():

Looper.prepare() // to be able to make toast
Toast.makeText(context, "not connected", Toast.LENGTH_LONG).show()
Looper.loop()

কেন এই উত্তর আন্ডাররেটেড হয়?
DkPathhak

5

Rxjava এবং RxAndroid ব্যবহারকারীর জন্য:

public static void shortToast(String msg) {
    Observable.just(msg)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(message -> {
                Toast.makeText(App.getInstance(), message, Toast.LENGTH_SHORT).show();
            });
}

এই বন্ধনীগুলি অপ্রয়োজনীয়
বোরজা

4

আমার কলব্যাকগুলি যখন কোনও ডায়ালগ দেখানোর চেষ্টা করবে তখন আমি একই ইস্যুতে চলছিলাম।

আমি এটিকে ক্রিয়াকলাপের নিবেদিত পদ্ধতিগুলির সাথে সমাধান করেছি - ক্রিয়াকলাপ উদাহরণের সদস্য স্তরে - যে ব্যবহারrunOnUiThread(..)

public void showAuthProgressDialog() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mAuthProgressDialog = DialogUtil.getVisibleProgressDialog(SignInActivity.this, "Loading ...");
        }
    });
}

public void dismissAuthProgressDialog() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (mAuthProgressDialog == null || ! mAuthProgressDialog.isShowing()) {
                return;
            }
            mAuthProgressDialog.dismiss();
        }
    });
}

2
Handler handler2;  
HandlerThread handlerThread=new HandlerThread("second_thread");
handlerThread.start();
handler2=new Handler(handlerThread.getLooper());

এখন হ্যান্ডলার 2 মূল থ্রেডের চেয়ে বার্তাগুলি হ্যান্ডেল করতে একটি আলাদা থ্রেড ব্যবহার করবে।


1

কোনও থ্রেডে একটি ডায়লগ বা টোস্টার প্রদর্শন করতে, সর্বাধিক সংক্ষিপ্ত উপায় হল ক্রিয়াকলাপ অবজেক্টটি ব্যবহার করা।

উদাহরণ স্বরূপ:

new Thread(new Runnable() {
    @Override
    public void run() {
        myActivity.runOnUiThread(new Runnable() {
            public void run() {
                myActivity.this.processingWaitDialog = new ProgressDialog(myActivity.this.getContext());
                myActivity.this.processingWaitDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                myActivity.this.processingWaitDialog.setMessage("abc");
                myActivity.this.processingWaitDialog.setIndeterminate(true);
                myActivity.this.processingWaitDialog.show();
            }
        });
        expenseClassify.serverPost(
                new AsyncOperationCallback() {
                    public void operationCompleted(Object sender) {
                        myActivity.runOnUiThread(new Runnable() {
                            public void run() {
                                if (myActivity.this.processingWaitDialog != null 
                                        && myActivity.this.processingWaitDialog.isShowing()) {
                                    myActivity.this.processingWaitDialog.dismiss();
                                    myActivity.this.processingWaitDialog = null;
                                }
                            }
                        }); // .runOnUiThread(new Runnable()
...

0

টোস্ট, AlertDialogs চাহিদা UI 'তে থ্রেডে চালানোর জন্য, আপনাকে ব্যবহার করতে পারেন Asynctask কিছু ক্ষেত্রে আমরা সময় আউট কাস্টমাইজ করতে প্রয়োজন development.but অ্যান্ড্রয়েড তাদের সঠিকভাবে ব্যবহার করতে, তাই আমরা ব্যবহার টপিক কিন্তু থ্রেড আমরা আমরা ব্যবহার মত টোস্ট, Alertdialogs ব্যবহার করতে পারবেন না AsyncTask.S এ তাই পপআপগুলির জন্য আমাদের আলাদা হ্যান্ডলার দরকার ।

public void onSigned() {
    Thread thread = new Thread(){
        @Override
        public void run() {
            try{
                sleep(3000);
                Message message = new Message();
                message.what = 2;
                handler.sendMessage(message);
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    };
    thread.start();
}

উপরের উদাহরণে আমি আমার থ্রেডটি 3 সেকেন্ডে ঘুমাতে চাই এবং তার পরে আমি টোস্ট বার্তাটি দেখতে চাই, তার জন্য আপনার মূল স্ট্র্যাডে হ্যান্ডলারের প্রয়োগ করুন।

handler = new Handler() {
       public void handleMessage(Message msg) {
           switch(msg.what){
              case 1:
              Toast.makeText(getActivity(),"cool",Toast.LENGTH_SHORT).show();
              break;
           }
           super.handleMessage(msg);
       }
};

আমি এখানে সুইচ কেসটি ব্যবহার করেছি, কারণ যদি আপনাকে একইভাবে বিভিন্ন বার্তা প্রদর্শন করতে হয় তবে আপনি হ্যান্ডলারের শ্রেণীর মধ্যে স্যুইচ কেসটি ব্যবহার করতে পারেন ... আশা করি এটি আপনাকে সহায়তা করবে


0

এটি সাধারণত তখন ঘটে যখন কোনও মূল পাতায় কোনও পটভূমি থ্রেড থেকে কল করা হয়। উদাহরণস্বরূপ একটি উদাহরণটি দেখুন।

private class MyTask extends AsyncTask<Void, Void, Void> {


@Override
protected Void doInBackground(Void... voids) {
        textView.setText("Any Text");
        return null;
    }
}

উপরের উদাহরণে, আমরা টেক্সটভিউতে পাঠ্য সেট করে দিচ্ছি যা doInBackground () পদ্ধতি থেকে মূল UI থ্রেডে রয়েছে, যা কেবলমাত্র একটি শ্রমিকের থ্রেডে পরিচালনা করে।


0

আমারও একই সমস্যা ছিল এবং আমি অ্যাসিনটাস্ক <> এর ওভাররাইড ফাংশনটিতে পোস্টপেক্সেকিউট () ওভাররাইড ফাংশনে টোস্টটি রেখে কেবল এটি সংশোধন করেছি এবং এটি কাজ করেছে।


-2

আমি মূল কোডটি "প্রসঙ্গ" নয় এমন বার্তাটি দেখানোর জন্য নিম্নলিখিত কোডটি ব্যবহার করি,

@FunctionalInterface
public interface IShowMessage {
    Context getContext();

    default void showMessage(String message) {
        final Thread mThread = new Thread() {
            @Override
            public void run() {
                try {
                    Looper.prepare();
                    Toast.makeText(getContext(), message, Toast.LENGTH_LONG).show();
                    Looper.loop();
                } catch (Exception error) {
                    error.printStackTrace();
                    Log.e("IShowMessage", error.getMessage());
                }
            }
        };
        mThread.start();
    }
}

তারপরে নিম্নলিখিত হিসাবে ব্যবহার করুন:

class myClass implements IShowMessage{

  showMessage("your message!");
 @Override
    public Context getContext() {
        return getApplicationContext();
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.