Looper.prepare () ලෙස හැඳින්වූ නූල් තුළ හසුරුවන්නෙකු නිර්මාණය කළ නොහැක.


1007

පහත ව්‍යතිරේකයේ අර්ථය කුමක්ද; මම එය නිවැරදි කරන්නේ කෙසේද?

කේතය මෙයයි:

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)

11
මෙම පුස්තකාලය පරික්ෂා කරන්න compile 'com.shamanland:xdroid-toaster:0.0.5', එයට අවශ්‍ය runOnUiThread()හෝ Contextවිචල්‍ය නොවේ, සියලු පුරුදු නැති වී ඇත! Toaster.toast(R.string.my_msg);මෙහි ආයාචනය කිරීම උදාහරණයකි: github.com/shamanland/xdroid-toaster-example
ඔලෙක්සි කේ.

127
මොන තරම් මෝඩ දෝෂ පණිවිඩයක්ද! එය තරම් සරල විය හැකිය - UI නොවන නූල් එකකින් දර්ශන ස්පර්ශ වන විට සිදු කළ පරිදි UI නොවන නූල් එකකින් මෙය ඇමතිය නොහැක.
ධිරාජ් භාස්කර්

12
විවිධ කේත වලින් එකම ව්‍යතිරේක පණිවිඩයක් ලබා ගන්නා අය සඳහා: ව්‍යතිරේක පණිවිඩයේ තේරුම නම් ඔබ කේතය අමතන්නේ ලූපර් සකස් නොකළ නූල් හරහාය. සාමාන්‍යයෙන් එයින් අදහස් වන්නේ ඔබ UI නූල් වලින් නම් නොකියන නමුත් ඔබ (OP ගේ නඩුව) - සාමාන්‍ය නූල් එකක් ලූපර් සකස් නොකරයි, නමුත් UI නූල් සෑම විටම එසේ කරයි.
හෙලින් වැන්ග්

Le ඔබ සඳහන් කළ පුස්තකාලය ක්‍රියාත්මක කිරීම runOnUiThread () කිරීම හා සමාන වේ.
හෙලින් වැන්ග්

ඔව්, නමුත් එය ඉතා ප්‍රයෝජනවත් එතීමකි
ඔලෙක්සි කේ.

Answers:


714

ඔබ එය අමතන්නේ සේවක නූලකින්. ඔබට ඇමතිය යුතුයිToast.makeText()ප්‍රධාන ත්‍රෙඩ් එකෙන්ම (සහ UI සමඟ කටයුතු කරන වෙනත් බොහෝ කාර්යයන්). උදාහරණයක් ලෙස ඔබට හසුරුවන්නෙකු භාවිතා කළ හැකිය.

ප්‍රලේඛනයේ UI Thread සමඟ සන්නිවේදනය කිරීම බලන්න . කෙටියෙන්:

// 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();
}

වෙනත් විකල්ප:

ඔබට AsyncTask භාවිතා කළ හැකිය , එය පසුබිමේ ධාවනය වන බොහෝ දේ සඳහා හොඳින් ක්‍රියා කරයි. එහි ප්‍රගතිය දැක්වීමට ඔබට ඇමතිය හැකි කොකු ඇත, එය සිදු වූ විට.

ඔබට Activity.runOnUiThread () ද භාවිතා කළ හැකිය .


මුල් ගැටලුව ගැන කුමක් කිව හැකිද (එය ඇලර්ට් ඩයලොග් ගැන නොවේ)?
අයිවන් ජී

5
ක්ලෙගී කියපු දේට මගේ ශත දෙක එකතු කරන්න. කේතගත උදාහරණයකට බොහෝ විට තමාටම පරිමාව කථා කළ හැකි බැවින්, ඔබ අදහස් කරන දේ (කෙසේ වෙතත් සැලසුම් කර ඇති) කෙටියෙන් නිරූපණය කිරීම වඩාත් සුදුසුය.
cdata

5
සම්පූර්ණ තාක්ෂණික පිළිතුරක් සඳහා මෙම prasanta-paul.blogspot.kr/2013/09/…
tony9099

3
GUI සඳහා සහය දක්වන සියලුම ක්‍රමලේඛන භාෂාවන්හි පාහේ, ඔබ GUI සමඟ කෙලින්ම යාවත්කාලීන කිරීම / වෙනස් කිරීම / ප්‍රදර්ශනය කිරීම / අන්තර්ක්‍රියා කරන්නේ නම්, එය වැඩසටහනේ ප්‍රධාන නූලෙන් කළ යුතුය.
අහමඩ්

(and most other functions dealing with the UI)පසුබිමෙන් භාවිතා කළ හැකි UI ශ්‍රිතයක උදාහරණයක් නම් android.support.design.widget.Snackbar- UI නූල් වලින් ඇමතුමක් නොගන්නා විට එහි ක්‍රියාකාරිත්වය අඩු නොවේ.
සීරීම්

864

ඔබට Toast.makeText(...)UI නූලෙන් ඇමතිය යුතුය :

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

මෙය වෙනත් (අනුපිටපත්) SO පිළිතුරකින් පිටපත් කර ඇත.


13
නියම පිළිතුර. මෙය මා කලක සිට ව්‍යාකූල විය. සටහන් කිරීමට, මට ක්‍රියාකාරකම අවශ්‍ය නොවීය. runOnUiThread ධාවනය කිරීමට පෙර.
Cen92

450

යාවත්කාලීන කිරීම - 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
    }
});
}

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

මම දන්නවා මම ටිකක් පරක්කුයි නමුත් මෙන්න යනවා. ඇන්ඩ්‍රොයිඩ් මූලික වශයෙන් ක්‍රියා කරන්නේ UI නූල් සහ පසුබිම් නූල් යන නූල් වර්ග දෙකක ය . ඇන්ඩ්‍රොයිඩ් ප්‍රලේඛනයට අනුව -

මෙම ගැටළුව විසඳීම සඳහා UI නූල් වලින් පිටත සිට ඇන්ඩ්‍රොයිඩ් UI මෙවලම් කට්ටලයට ප්‍රවේශ නොවන්න, ඇන්ඩ්‍රොයිඩ් වෙනත් නූල් වලින් UI නූල් වෙත ප්‍රවේශ වීමට ක්‍රම කිහිපයක් ඉදිරිපත් කරයි. උදව් කළ හැකි ක්‍රම ලැයිස්තුවක් මෙන්න:

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();

ලූපර්

නූල් සඳහා පණිවිඩ පුඩුවක් ධාවනය කිරීමට භාවිතා කරන පන්තිය. පෙරනිමියෙන් නූල් වලට පණිවිඩ ලූපයක් සම්බන්ධ නොවේ; එකක් නිර්මාණය කිරීමට, ලූපය ධාවනය කිරීමට අවශ්‍ය නූල් එකේ සූදානම් () අමතන්න, ඉන්පසු ලූප් () ලූපය නතර වන තුරු පණිවිඩ සැකසීමට එය කරන්න.

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 ඔබට ඉඩ දෙයි. එය සේවක ත්‍රෙඩ් එකක අවහිර කිරීමේ මෙහෙයුම් සිදු කරන අතර ප්‍රති the ල UI නූල් මත ප්‍රකාශයට පත් කරයි.

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 භාවිතා කරන අතර මට නැවත අරා ලැයිස්තුවක් ලබා ගැනීමට අවශ්‍ය නමුත් මට සෑම විටම දෝෂය ඇතිවේ: Looper.prepare () ලෙස නොකියන නූල් තුළ හසුරුවන්නෙකු නිර්මාණය කළ නොහැක. මෙය මගේ ප්‍රශ්නය stackoverflow.com/questions/45562615/… බලන්න, නමුත් මට මෙම පිළිතුරෙන් විසඳුම ලබා ගත නොහැක
WeSt

126

Toast.makeText()කැඳවිය යුත්තේ ප්‍රධාන / යූඅයි නූල් වලින් පමණි. Looper.getMainLooper ()එය සාක්ෂාත් කර ගැනීමට ඔබට උපකාරී වේ:

ජාවා

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

කොට්ලින්

Handler(Looper.getMainLooper()).post {
                    Toast.makeText(mContext, "Something", Toast.LENGTH_SHORT)
                }

මෙම ක්‍රමයේ වාසියක් නම් ඔබට එය ක්‍රියාකාරකම් හෝ සන්දර්භය නොමැතිව භාවිතා කළ හැකිය.


2
ස්තූතියි අනෙක් පිළිතුරු මා වෙනුවෙන් වැඩ කළේ නැත. ස්ථීරභාවය කළමනාකරණය කිරීම සඳහා මම පුස්තකාල සීනි වාර්තාවක් භාවිතා කරමි. ඒ තුළ මට ක්‍රියාකාරකමක් නැත. නමුත් මෙය පුදුම සහගත ලෙස ක්‍රියාත්මක වේ
cabaji99

91

හසුරුවන්නාට පෙර ලූපර් සූදානම් නොවීම නිසා ධාවන කාල එක්ස්පෙන්ෂන් දුටු විට මෙය උත්සාහ කරන්න.

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

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

හෑන්ඩ්ලර් යනු වියුක්ත පන්තියකි. මෙය සම්පාදනය නොකරයි
ස්ටීල්ත් රබ්බි

2
NameStealthRabbi නිවැරදි නාම අවකාශයෙන් හෑන්ඩ්ලර් ආනයනය කරන්න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);
}

UIHandler නිර්මාණය කිරීම සඳහා, ඔබ පහත සඳහන් දෑ සිදු කළ යුතුය:

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

මෙය උපකාරී වේ යැයි සිතමි.


මම ඔබේ කේතය භාවිතා කිරීමට උත්සාහ කළ නමුත් මට අහිමි වූ onCreate methodඅතර මගේ තත්වය තුළ අසින්ක් ටාස්ක් වෙතින් හෝ ඇමතිය යුත්තේ කෙසේදැයි මට විශ්වාස නැත.
නික් කාන්

2
එම අවසාන පේළිය කියවිය යුතු uiHandler = new UIHandler(uiThread.getLooper()); නොවේද?
බියර් මී

37

දෝෂයක් සඳහා හේතුව:

සේවක නූල් යනු පසුබිම් කාර්යයන් කිරීම සඳහා වන අතර ඔබ runOnUiThread වැනි ක්‍රමයක් අමතන්නේ නැත්නම් ඔබට සේවක නූල් තුළ UI හි කිසිවක් පෙන්විය නොහැක . RunOnUiThread ඇමතීමෙන් තොරව ඔබ UI නූල් මත කිසිවක් පෙන්වීමට උත්සාහ කරන්නේ නම්, a 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));(
දීර් know

ඉතින් ApplicationHolder.INSTANCEතක්සේරු කරන්නේ කුමක් ද?
ඉගෝර්ගනාපොල්ස්කි

ක්‍රියාවලිය පවතින අතරතුර යෙදුම සැමවිටම පවතින CustomApplicationබැවින් CustomApplication.onCreate(), සැකසීමේ ස්ථිතික විචල්‍යයක් පවතී, මෙම සන්දර්භය ගෝලීයව භාවිතා කළ හැකිය
එපික් පැන්ඩාෆෝර්ස්

12
 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(); });
Black_Zerg

11

පුදුමාකාර කොට්ලින් විසඳුම:

runOnUiThread {
    // Add your ui thread code here
}

5
runOnUiThreadක්‍රියාකාරකමේ කොටසකිactivity?.runOnUiThread { ... }
AtomicStrongForce

9

එයට හේතුව Toast.makeText () සේවක නූලකින් ඇමතීමයි. එය මේ ආකාරයට ප්‍රධාන UI නූල් වලින් ඇමතිය යුතුය

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

8

චිකෝබර්ඩ්ගේ පිළිතුර මට වැඩ කළේය. මා කළ එකම වෙනස වූයේ මට කළ යුතු UIHandler නිර්මාණය කිරීමයි

HandlerThread uiThread = new HandlerThread("UIHandler");

සූර්යග්‍රහණය වෙනත් කිසිවක් පිළිගැනීම ප්‍රතික්ෂේප කළේය. මම හිතන්නේ තේරුමක් තියෙනවා.

එසේම uiHandlerඑය පැහැදිලිවම කොතැනක හෝ අර්ථ දක්වා ඇති පන්ති ගෝලීය වේ. ඇන්ඩ්‍රොයිඩ් මෙය කරන්නේ කෙසේද සහ සිදුවන්නේ කුමක්ද යන්න තේරුම් ගැනීමට මම තවමත් හිමිකම් නොකියමි, නමුත් එය ක්‍රියාත්මක වීම ගැන මම සතුටු වෙමි. දැන් මම එය අධ්‍යයනය කර ඇන්ඩ්‍රොයිඩ් කරන්නේ කුමක්ද සහ මට මේ සියලු වළලු සහ ලූප හරහා යා යුත්තේ ඇයි දැයි තේරුම් ගත හැකිදැයි බලන්නෙමි. චිකෝබර්ඩ්ගේ උදව්වට ස්තූතියි.


8

පළමු ඇමතුම 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()

1
මෙම පිළිතුර අවතක්සේරු කරන්නේ ඇයි?
DkPathak

වර්තමාන භාවිතය ගැන මම නොදනිමි, නමුත් අභ්‍යන්තරව ක්‍රියාකාරකමක් අඩංගු ධාවනය කළ හැකි භාජන ගොනුවක් භාවිතා කරන අතරතුර මෙය මා බේරා ගත්තේය.
ජෝන් සාමිවරයා

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

ටෝස්ට්, ඇලර්ට් ඩයලොග්ස් යූඅයි නූල් මත ධාවනය කිරීමට අවශ්‍යයි, ඔබට ඒවා ඇන්ඩ්‍රොයිඩ් සංවර්ධනයේදී නිසි ලෙස භාවිතා කිරීමට අසින්ක්ටාස්ක් භාවිතා කළ හැකිය.නමුත් සමහර අවස්ථාවලදී අපට කාලය ඉකුත්වීම රිසිකරණය කිරීමට අවශ්‍ය වේ, එබැවින් අපි නූල් භාවිතා කරන්නෙමු , නමුත් නූල් වලදී අපට ටෝස්ට්, ඇලර්ට් ඩයලොග් භාවිතා කළ නොහැක. AsyncTask හි. එබැවින් අපට උත්පතන සඳහා වෙනම හෑන්ඩ්ලර් අවශ්‍ය වේ.

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();
}

ඉහත උදාහරණයේ දී මට මගේ නූල් 3sec තුළ නිදා ගැනීමට අවශ්‍ය වන අතර මට ටෝස්ට් පණිවිඩයක් පෙන්වීමට අවශ්‍ය වූ පසු, ඒ සඳහා ඔබේ ප්‍රධාන පෙළේ ක්‍රියාත්මක කිරීමේ හසුරුවන්න.

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

මට එකම ගැටළුවක් ඇති අතර, මම එය ටෝස්ට් ඔන් පෝස්ට්එක්ස්කියුට් () අසින්ක්ටාස්ක් <> හි අභිබවා යන ශ්‍රිතයට ඇතුළත් කිරීමෙන් එය නිවැරදි කළෙමි.


0

ඔබට UI නූල් මත ටෝස්ට් සෑදිය යුතුය. පහත උදාහරණය සොයා ගන්න.

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

ටෝස්ට් පණිවිඩය ප්‍රදර්ශනය කිරීම සඳහා කරුණාකර මෙම ලිපිය බලන්න


0

කොරොටින් භාවිතා කරමින් කෝට්ලින් සඳහා විසඳුම මෙන්න:

MainScope () විසින් CoroutineScope සමඟ ඔබේ පන්තිය දිගු කරන්න:

class BootstrapActivity :  CoroutineScope by MainScope() {}

ඉන්පසු මෙය සරලව කරන්න:

launch {
        // whatever you want to do in the main thread
    }

කොරෝටීන් සඳහා පරායත්තතා එකතු කිරීමට අමතක නොකරන්න:

org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.kotlinCoroutines}
org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.kotlinCoroutines}

නැතහොත් සරලව launch(Dispatchers.Main) { ... } .
CoolMind



-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();
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.