正在从附加有后台线程的处理程序中显示Toast。不确定如何发生?

时间:2019-03-04 02:53:41

标签: java android android-handler android-thread

我使用了HandlerThread,然后使用其循环程序创建了一个新的Handler,以便它可以在非UI线程上运行操作。在发布到处理程序的runnable中,我添加了Toast消息以进行显示。我希望这会引起问题,因为您无法通过非UI线程触摸UI组件,但是它仍然可以正常工作,并且仍在显示Toast。谁能解释为什么从非UI线程显示吐司吗?

 //Inside a Fragment class
    private Handler handler;
    private HandlerThread mHandlerThread = null;

    public void startHandlerThread() {
        mHandlerThread = new HandlerThread("HandlerThread");
        mHandlerThread.start();
        handler = new Handler(mHandlerThread.getLooper());
    }


    private Runnable submitRunnable = new Runnable() {
        @Override
        public void run() {
            //do some long running operations here
            //Thread.sleep(2000);

            //Check whether currentLooper is the Main thread looper
            boolean isUiThread = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
                    ? Looper.getMainLooper().isCurrentThread()
                    : Thread.currentThread() == Looper.getMainLooper().getThread();

            if (isUiThread) {
                // You are on the UI thread
                Log.d("Thread", "Main thread");
            } else {
                // You are on the non-UI thread
                Log.d("Thread", "Not Main thread"); //This will be printed
            }

            Toast.makeText(getContext(), "toast is shown", Toast.LENGTH_SHORT).show();
        }
    };

    submitButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                handler.post(submitRunnable);
            }
        });

我检查了Toast.java,发现循环程序使用Looper.myLooper()进行了初始化。

 if (looper == null) {
            // Use Looper.myLooper() if looper is not specified.
            looper = Looper.myLooper();
        }

doc

myLooper(): Return the Looper object associated with the current thread.

并且currentThread是HandlerThread,而不是主线程。 因此,我无法从非UI线程中了解如何显示烤面包,或者我看不到它是否很简单。

1 个答案:

答案 0 :(得分:1)

为显示Toast,您使用getContext()作为上下文。

getContext()-返回视图当前正在其中运行的上下文。通常是当前活动的Activity。

使用片段时,它将使用活动上下文,而片段将驻留在活动中。

这就是为什么吐司出现的原因。