Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从后台线程显示toast消息_Java_Android - Fatal编程技术网

Java 如何从后台线程显示toast消息

Java 如何从后台线程显示toast消息,java,android,Java,Android,考虑以下代码。在Service.onStart()方法中,我创建并启动了一个线程,该线程应该显示Toast消息,但它不工作 public class MyService extends Service{ private static final String TAG = "MyService"; @Override public IBinder onBind(Intent intent) { return null; }

考虑以下代码。在
Service.onStart()
方法中,我创建并启动了一个线程,该线程应该显示Toast消息,但它不工作

public class MyService extends Service{

    private static final String TAG = "MyService";  
    @Override
    public IBinder onBind(Intent intent)
    {
        return null;    
    }       

    @Override   
    public void onCreate()
    {   
    Toast.makeText(this, "My Service Created", Toast.LENGTH_SHORT).show();
         }  
    @Override
    public void onDestroy() 
    {   
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_SHORT).show();  
    }   
    @Override
    public void onStart(Intent intent, int startid)
    {
      Toast.makeText(this, "My Service Started", Toast.LENGTH_SHORT).show();
      DBIteratorThread dbThread=new DBIteratorThread();
      dbThread.myService=this;
      Thread t1 = new Thread(dbThread);
           t1.start();
    }

}
class DBIteratorThread  implements Runnable
{

    MyService myService;

    public void run()
    {
    //  Toast.makeText(myService, "Thread is Running", Toast.LENGTH_SHORT).show();
            }
}

getBaseContext()替换
this

您应该能够使用getApplicationContext()方法获取用于显示Toast的上下文


有关这方面的一些精彩讨论,请参阅。

我编写了一个类,用于显示来自后台进程的
祝酒词。可以在任何地方使用,例如在
异步任务
中。您只需创建此类的实例,如

ToastHandler mToastHandler = new ToastHandler(yourContext);
然后调用
showtoos()
,使用您的文本或资源id和
Toast的持续时间,就像您通常使用
makeToast()
一样

以下是代码或直接下载:


在主/UI线程中执行UI填充。试试这个:

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

handler.post(new Runnable() {

        @Override
        public void run() {
            //Your UI code here
        }
    });

不能在非活动ui线程的线程上显示祝酒词。
如果使用
runOnUiThread
方法使其在ui线程上运行,则只能在其他地方运行它

看看这个问题

我们使用handler实现此目的,因为它很容易…:)

步骤:

  • 在主活动(onCreate)中声明处理程序
  • 要在后台运行的类,用于创建参数化构造函数。将上下文作为一个边界
  • 现在从主活动创建一个线程,并传递该活动的上下文
  • 现在,从另一个线程(从您想要发送的任何线程)向处理程序发送Post
  • 现在在Toast中使用此上下文,而不是使用getApplicationContext()
  • 它运行良好

    mhandler.post(new Runnable() {
        public void run() {
            Toast.makeText(context,"Run ends",Toast.LENGTH_LONG).show();
        }
    });
    

    getApplicationContext()
    替换单词
    ,然后会出现消息

    Toast.makeText(this, "My Service Created", Toast.LENGTH_SHORT).show();
    
    正确的:

    Toast.makeText(getApplicationContext(), "My Service Created", Toast.LENGTH_SHORT).show();
    

    这也适用于您Runnable()中“thread.interrupt()”和“thread=null”的用途是什么?将thread设置为null是多余的,因为当函数返回时,该变量将消失。我不是
    thread
    专家。我只是想避免可能出现的问题或副作用
    Toast.makeText(getApplicationContext(), "My Service Created", Toast.LENGTH_SHORT).show();