顯示Toast需要在主UI線程中完成。以下代碼是可以從任何線程(包括後臺服務,當您的應用程序甚至不在前臺時)執行的靜態方法的示例。
public class ServiceUtils {
//-------------------------------------------------------------------------
// Constructor
// All methods in this class are static, no need for a public constructor
private ServiceUtils() {}
private static final Handler s_toastHandler = new Handler(Looper.getMainLooper());
public static void notifyUI(final Context context, final String toastMsg) {
s_toastHandler.post(new Runnable() {
public void run() {
try {
Toast.makeText(context,
toastMsg,
Toast.LENGTH_SHORT).show();
}
catch(Exception ex) {
Log.e(ServiceUtils.class.getSimpleName(), ex.getMessage());
}
}
});
}
}
現在你可以從任何地方撥打:
ServiceUtils.notifyUI(getApplicationContext(), "some toast message")
外部類?你的意思是內部課堂嗎? – Simas 2014-11-20 17:18:04
如果您需要從AsyncTask中更新UI(例如使用'Toast'),如註釋中所示,您可以在'onPostExecute()'或除'doInBackground()'之外的任何方法中做到這一點,如果它是活動的內部類。如果你的'AsyncTask'是一個單獨的文件,[看到這個關於使用接口的答案](http://stackoverflow.com/questions/18517400/inner-class-can-access-but-not-update-values-asynctask/ 18517648#18517648) – codeMagic 2014-11-20 19:45:27