2011-09-11 42 views
10

请考虑以下代码。在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(); 
      } 
} 
+0

这应该还HTTP工作://计算器。 com/questions/6134013/android-how-can-i-show-a-to-a-thread-running-in-a-remote-service – eyespyus

回答

0

替代thisgetBaseContext()

+0

仍然不能正常工作 –

8

我写了一个从后台进程中显示Toasts的类。可以在任何地方使用,例如在AsyncTask。你只需要像

ToastHandler mToastHandler = new ToastHandler(yourContext); 

创建这个类的一个实例,然后调用showToast()用文字或资源ID和Toast's时间就像你通常会与makeToast()

这里是代码或直接下载link

import android.content.Context; 
import android.os.Handler; 
import android.widget.Toast; 

/** 
* A class for showing a <code>Toast</code> from background processes using a 
* <code>Handler</code>. 
* 
* @author kaolick 
*/ 
public class ToastHandler 
{ 
    // General attributes 
    private Context mContext; 
    private Handler mHandler; 

    /** 
    * Class constructor. 
    * 
    * @param _context 
    *   The <code>Context</code> for showing the <code>Toast</code> 
    */ 
    public ToastHandler(Context _context) 
    { 
    this.mContext = _context; 
    this.mHandler = new Handler(); 
    } 

    /** 
    * Runs the <code>Runnable</code> in a separate <code>Thread</code>. 
    * 
    * @param _runnable 
    *   The <code>Runnable</code> containing the <code>Toast</code> 
    */ 
    private void runRunnable(final Runnable _runnable) 
    { 
    Thread thread = new Thread() 
    { 
     public void run() 
     { 
     mHandler.post(_runnable); 
     } 
    }; 

    thread.start(); 
    thread.interrupt(); 
    thread = null; 
    } 

    /** 
    * Shows a <code>Toast</code> using a <code>Handler</code>. Can be used in 
    * background processes. 
    * 
    * @param _resID 
    *   The resource id of the string resource to use. Can be 
    *   formatted text. 
    * @param _duration 
    *   How long to display the message. Only use LENGTH_LONG or 
    *   LENGTH_SHORT from <code>Toast</code>. 
    */ 
    public void showToast(final int _resID, final int _duration) 
    { 
    final Runnable runnable = new Runnable() 
    { 
     @Override 
     public void run() 
     { 
     // Get the text for the given resource ID 
     String text = mContext.getResources().getString(_resID); 

     Toast.makeText(mContext, text, _duration).show(); 
     } 
    }; 

    runRunnable(runnable); 
    } 

    /** 
    * Shows a <code>Toast</code> using a <code>Handler</code>. Can be used in 
    * background processes. 
    * 
    * @param _text 
    *   The text to show. Can be formatted text. 
    * @param _duration 
    *   How long to display the message. Only use LENGTH_LONG or 
    *   LENGTH_SHORT from <code>Toast</code>. 
    */ 
    public void showToast(final CharSequence _text, final int _duration) 
    { 
    final Runnable runnable = new Runnable() 
    { 
     @Override 
     public void run() 
     { 
     Toast.makeText(mContext, _text, _duration).show(); 
     } 
    }; 

    runRunnable(runnable); 
    } 
} 
+0

“thread.interrupt( )“和”thread = null“在runRunnable()?将线程设置为null是多余的,因为该函数在函数返回时会消失。 – Clyde

+0

我不是'线程'专家。我只是想避免可能的问题或副作用。 ;-) – kaolick

+0

谢谢考利克,工程像一个魅力;).. – Shah

19

待办事项UI充塞在主/ UI线程。试试这个:

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

handler.post(new Runnable() { 

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

你不能在不是活动的UI线程的线程上显示Toast。
你只能运行在别的地方,如果你使用runOnUiThread方法,以便它运行在UI线程上的

看这个问题
Android: Toast in a thread