- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用了 HandlerThread,然后使用它的循环器创建了一个新的 Handler,以便它可以在非 UI 线程上运行操作。在发布到处理程序的可运行对象中,我添加了要显示的 Toast 消息。我预计这会导致问题,因为您无法从非 UI 线程触摸 UI 组件,但它仍然有效并且 toast 仍在显示。谁能解释为什么从非 UI 线程显示 toast?
//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,不是主线程。因此,我无法理解 toast 是如何从非 UI 线程显示的,或者它是否是我看不到的简单内容。
最佳答案
为了显示 Toast,您使用了 getContext()
作为上下文。
getContext()
- 返回 View 当前运行的上下文。通常是当前 Activity 的 Activity。
当您使用 fragment 时,它将采用 fragment 将驻留在 Activity 中的 Activity 上下文。
这就是 Toast 显示的原因。
关于java - Toast 正在从附加了后台线程的处理程序中显示。不确定那是怎么发生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54976016/
我在尝试执行以下代码时遇到了一些麻烦: #include #include int main(int argc, char** argv) { std::wstring buffer; /
这是一个有点出乎意料的行为,可能会咬到初学者。首先,这是故意的吗?其次,Perl 6 还使用哪些其他东西来猜测要创建哪个对象?它是开始认为是 Block 还是 Hash 并稍后更改,还是最终决定? 您
subArraySum 中的 for 循环调用 sumArray ,它也包含一个 for 循环。这会被认为是 O(n^2) 时间吗?放轻松,因为这是我的第一个问题,正如您从我的代码中看到的那样,我是初
我是一名优秀的程序员,十分优秀!