Ama*_*mar 90 multithreading android toast
我有一个运行线程的Android应用程序.我想要一条Toast消息来显示消息.
当我这样做时,我得到以下异常:
Logcat跟踪:
FATAL EXCEPTION: Timer-0
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$TN.<init>(Toast.java:322)
at android.widget.Toast.<init>(Toast.java:91)
at android.widget.Toast.makeText(Toast.java:238)
Run Code Online (Sandbox Code Playgroud)
是否有解决方案将Toast消息从线程推送到用户界面?
Eri*_*ski 120
我得到了这个例外,因为我试图从后台线程制作一个Toast弹出窗口.
Toast需要一个Activity来推送到用户界面,而线程没有.
因此,一种解决方法是为线程提供指向父Activity和Toast的链接.
将此代码放在要发送Toast消息的线程中:
parent.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(parent.getBaseContext(), "Hello", Toast.LENGTH_LONG).show();
}
});
Run Code Online (Sandbox Code Playgroud)
在创建此线程的后台线程中保留指向父Activity的链接.在线程类中使用父变量:
private static YourActivity parent;
Run Code Online (Sandbox Code Playgroud)
创建线程时,通过构造函数将父Activity作为参数传递,如下所示:
public YourBackgroundThread(YourActivity parent) {
this.parent = parent;
}
Run Code Online (Sandbox Code Playgroud)
现在后台线程可以将Toast消息推送到屏幕.
kum*_*dan 33
Android基本上适用于两种线程类型,即UI线程和后台线程.根据android文档 -
不要从UI线程外部访问Android UI工具包来解决此问题,Android提供了几种从其他线程访问UI线程的方法.以下是可以提供帮助的方法列表:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Run Code Online (Sandbox Code Playgroud)
现在有各种方法可以解决这个问题.我将通过代码示例解释它
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();
Run Code Online (Sandbox Code Playgroud)
LOOPER
用于为线程运行消息循环的类.默认情况下,线程没有与之关联的消息循环; 创建一个,在运行循环的线程中调用prepare(),然后循环()让它处理消息,直到循环停止.
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();
}
Run Code Online (Sandbox Code Playgroud)
的AsyncTask
AsyncTask允许您在用户界面上执行异步工作.它在工作线程中执行阻塞操作,然后在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
}
}
Run Code Online (Sandbox Code Playgroud)
处理器
Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象.
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;
}
});
Run Code Online (Sandbox Code Playgroud)
这是我一直在做的事情:
public void displayError(final String errorText) {
Runnable doDisplayError = new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), errorText, Toast.LENGTH_LONG).show();
}
};
messageHandler.post(doDisplayError);
}
Run Code Online (Sandbox Code Playgroud)
这应该允许从任一线程调用该方法.
其中messageHandler在活动中声明为..
Handler messageHandler = new Handler();
Run Code Online (Sandbox Code Playgroud)
小智 6
来自http://developer.android.com/guide/components/processes-and-threads.html:
此外,Android UI工具包不是线程安全的.因此,您不能从工作线程操纵UI - 您必须从UI线程对您的用户界面进行所有操作.因此,Android的单线程模型只有两个规则:
- 不要阻止UI线程
- 不要从UI线程外部访问Android UI工具包
您必须检测工作线程中的空闲状态并在主线程中显示Toast.
如果您想要更详细的答案,请发布一些代码.
代码发布后:
在 strings.xml
<string name="idleness_toast">"You are getting late do it fast"</string>
Run Code Online (Sandbox Code Playgroud)
在 YourWorkerThread.java
Toast.makeText(getApplicationContext(), getString(R.string.idleness_toast),
Toast.LENGTH_LONG).show();
Run Code Online (Sandbox Code Playgroud)
不要使用AlertDialog,做出选择.AlertDialog和Toast是两回事.
归档时间: |
|
查看次数: |
129562 次 |
最近记录: |