如何确保finish()破坏活动并清除所有变量?

时间:2016-06-17 12:01:00

标签: android

我正在一个有两个活动的项目中工作,一个显示数据库中的行列表,当您单击一个活动时,它会打开包含您可以编辑的元素的表单的其他活动;

问题在于,当我关闭第二个活动并重新打开它时(即使我调用finish()),一些变量会保留最后一个“会话”的数据。

所以可能有疑问:我如何清除所有变量/破坏活动?

修改

当我继续阅读和尝试时,我仍然无法找出真正的问题所以有一些额外的信息:

我正在使用的自定义控制器

public class CustomEditText extends EditText {

    private boolean edited=false;
    private boolean init;
    private boolean justLoad;
    private String oldText;
    public boolean required;

    public boolean isEdited() {
        return edited;
    }

    public String getOldText() {
        return oldText;
    }

    public CustomEditText(Context context) {
        super(context);
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);
        if (justLoad) {
            edited=false;
            justLoad=false;
        } else {
            String currtext = this.getText().toString();
            if (!init) {
                oldText = currtext;
                init = true;
            }
            if (!currtext.equals(oldText)) {
                edited = true;
            } else {
                edited = false;
            }
        }
        Log.d("cet",this.getText().toString()+" != "+oldText+" "+edited);
    }

    public void load(String text){
        init=true;
        oldText=text;
        edited=false;
        justLoad=true;
        this.setText(text);
    }
}

-Utility class(也试过非静态

public class CustomViewUtilities {

    private static boolean edited=false;
    private static  ArrayList<EditText> list = new ArrayList<>();

    public  static boolean isAnyEdited(ViewGroup view){
        CustomViewUtilities c = new CustomViewUtilities();
        c.traverseEditTexts(view);
        return edited;
    }

    public static ArrayList<EditText> getList(ViewGroup view) {
        list.clear();
        CustomViewUtilities c = new CustomViewUtilities();
        c.traverseEditTexts(view);
        return list;
    }

    private EditText traverseEditTexts(ViewGroup v)
    {
        EditText invalid = null;
        for (int i = 0; i < v.getChildCount(); i++)
        {
            Object child = v.getChildAt(i);
            if (child instanceof EditText)
            {
                EditText e = (EditText)child;
                if (e instanceof CustomAutoCompleteTextView){
                    list.add(e);

                    if (((CustomAutoCompleteTextView) e).isEdited()) {
                        edited = true;}
                } else if (e instanceof CustomEditText) {
                    if (((CustomEditText) e).isEdited()) {
                        edited = true;}
                    list.add(e);
                }
            }
            else if(child instanceof ViewGroup)
            {
                invalid = traverseEditTexts((ViewGroup)child);  // Recursive call.
                if(invalid != null)
                {
                    break;
                }
            }
        }
        return invalid;
    }
}

我还尝试更改android:launchMode但没有结果。 问题是,如果CustomViewUtilities.isAnyEdited(view);方法在下次启动该活动时返回true,则第二次启动活动。

感谢任何帮助。

5 个答案:

答案 0 :(得分:3)

覆盖onDestroy()方法,在此方法中只需调用finish()Runtime.getRuntime().gc()方法...

必须为所有变量分配NULL ...

我的代码:

@Override
public void onDestroy() {
    super.onDestroy();
    try{
        Runtime.getRuntime().gc();
        finish();
    }catch (Exception e){
        e.printStackTrace();
    }
}

答案 1 :(得分:0)

如果您保留活动中的所有数据,则不会发生这种情况。如果您从Activity(Application类之外,直接从数据库或SharedPrefs)读取数据,它将保持不变。

如果不是这样的话我的建议是创建这样的东西:

private void invalidateData(){
// invalidate all relevant fields (set as null or 0)
}

在活动onDestroy方法

上调用此方法

答案 2 :(得分:0)

考虑文档调用完成方法不保证立即销毁。 但是根据您的情况,您可以覆盖onPause方法。当活动变为隐藏时,它会自动调用。如果要使用它,则必须在onResume方法中初始化数据。 https://developer.android.com/training/basics/activity-lifecycle/pausing.html

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
}

@Override
protected void onResume() {
    super.onResume();
    // init data here
}

@Override
protected void onPause() {
    super.onPause();
    // destroy data here
}

答案 3 :(得分:0)

object.__proto__ = SmartObject.prototype;

请注意,您要调用finish()方法的活动已被销毁,其所有资源都排队以进行垃圾回收,并且将释放此活动使用的所有内存在下一个GC周期期间。

如果您真的想要尽快撤销内存,请覆盖您的活动&#39; onDestroy方法:

yourExistingActivity.finish();  // This **requests** for freeing the memory

答案 4 :(得分:0)

最后问题与android无关,实际问题是CustomViewUtilities.edited;每当private boolean edited=false;转为静态private static boolean edited=false;时,最初会实例化,所以它永远不会回到假永远不会被摧毁。