工具类如下

/**
* @author WangYehan
*
* @desc 线程安全的土司工具类 | 支持简单自定义土司
*/
public class ShowTool {

/** 线程安全的土司 */
public static void show(final Activity ctx, final String text) {
if ("main".equalsIgnoreCase(Thread.currentThread().getName())) {
show(ctx, text, Toast.LENGTH_SHORT);
} else {
ctx.runOnUiThread(new Runnable() {
@Override
public void run() {
show(ctx, text, Toast.LENGTH_SHORT);
}
});
}
}


/** 线程安全的长土司 */
public static void show(final Activity ctx, final String text, final int length) {
if ("main".equalsIgnoreCase(Thread.currentThread().getName())) {
Toast.makeText(ctx, text, length).show();
} else {
ctx.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(ctx, text, length).show();
}
});
}
}


/** 其他对齐方式的吐司 */
public static void showLoc(final Activity ctx, final String text, final int length) {
Toast toast = Toast.makeText(ctx, text, length);
// 设置吐司的展示位置
toast.setGravity(Gravity.CENTER, 0, 0);
toast.setMargin(10, 20);
toast.show();
}


/** 自定义吐司:可以在自定义土司布局中添加文字、图片 */
public static void showMy(final Activity ctx, final int layoutId, final String text,final int img, final int length) {
// 获取吐司的根视图
View rootView = LayoutInflater.from(ctx).inflate(layoutId, null);

// 设置文字
((TextView) rootView.findViewById(R.id.tv_toast)).setText(text);
// 设置图片
((ImageView) rootView.findViewById(R.id.iv_toast)).setImageResource(img);

Toast toast = new Toast(ctx);
// 修改吐司对齐方式
toast.setGravity(Gravity.CENTER, 0, 0);
// 添加自定义的土司布局
toast.setView(rootView);
// 设置展示时间
toast.setDuration(length);
// 展示吐司
toast.show();
}
}

使用方式

ShowTool.show(this, "原生土司...");

ShowTool.showLoc(this, "自定位置土司...", Toast.LENGTH_SHORT);

ShowTool.showMy(this, R.layout.toast, "自定布局土司...", R.mipmap.ic_launcher, 0);

以上。如有错误和疑问,欢迎指正提出。