Singleton类,使用资源有效地显示在不同活动中的祝酒词

时间:2017-12-06 18:35:19

标签: java android design-patterns android-activity android-toast

我有一个单例类(让我们称之为: SingleWorker ),它在多个活动中使用。根据具体情况,如果正在执行任务,则会显示Toast或进度对话框。我有两种方法可以做到这一点:

1)在单例中创建一个单独的方法 - SingleWorker,它将在显示toast / progress之前获取活动的上下文

2)在扩展的应用程序单例中,我将存储,每次我输入一个新的活动(及其onResume)它的实例,然后我将在SingleWorker单例中使用它。

哪一个是更好的选择(我猜第一个),我可以做得更好吗?我试图自己找到一个有效的答案,但我需要一个方向或一个提示。感谢任何想法,建议,建议或链接。谢谢阅读 !

2 个答案:

答案 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