我有一个单例类(让我们称之为: SingleWorker ),它在多个活动中使用。根据具体情况,如果正在执行任务,则会显示Toast或进度对话框。我有两种方法可以做到这一点:
1)在单例中创建一个单独的方法 - SingleWorker,它将在显示toast / progress之前获取活动的上下文
2)在扩展的应用程序单例中,我将存储,每次我输入一个新的活动(及其onResume)它的实例,然后我将在SingleWorker单例中使用它。
哪一个是更好的选择(我猜第一个),我可以做得更好吗?我试图自己找到一个有效的答案,但我需要一个方向或一个提示。感谢任何想法,建议,建议或链接。谢谢阅读 !
答案 0 :(得分:0)
我使用第二种方法很长一段时间,并决定在遇到一些问题后转到第一种方法。 在上下文之外需要它时,在BaseActivity中存储上下文会更好(例如后台线程)要显示toast或对话框,你可以将它传递给singleton类中的方法(方法1) ),您将免于内存泄漏,并且不必担心在onResume()和onDestroy()方法中为contextStored提供新值。
以下是显示对话框的方法示例:
public static void showAcceptDialog(String message, final Context contex, View.OnClickListener onClickYes, View.OnClickListener onClickNo) {
dialog = new Dialog(contex);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.setContentView(R.layout.layout_of_your_dialog);
TextView tv = (TextView) dialog.findViewById(R.id.generic_accept_message);
//Seta o titulo do dialogo
tv.setText(message);
Button btNo = (Button) dialog.findViewById(R.id.generic_dialog_no);
if (onClickNo != null) {
btNo.setOnClickListener(onClickNo);
} else{
btNo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
Button btYes = (Button) dialog.findViewById(R.id.generic_dialog_yes);
if(onClickYes != null){
// dialog.dismiss();
btYes.setOnClickListener(onClickYes);
}
else {
btYes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
dialog.show();
}
答案 1 :(得分:0)
Toast
在可见性方面未绑定到特定Activity
。
这就是为什么他们有点'弃用'(不是正式的,这只是我对Google的设计指南和他们自己的应用的解释)的原因之一,而是支持Snackbar绑定到特定的View
。
我认为使用activity context
代替application context
创建Toast
没有任何优势。
反之亦然,当你的Singleton
持有对activity context
的引用时,你可能很容易通过抓住已经被破坏的Activity
来创建内存泄漏。
您可以将Activity
作为方法参数传入,但这可能不太方便(例如,从Activity
以外的类调用该方法)。
长话短说:我建议让SingleWorker
引用application context
来创建Toast
。