我正在一个有两个活动的项目中工作,一个显示数据库中的行列表,当您单击一个活动时,它会打开包含您可以编辑的元素的表单的其他活动;
问题在于,当我关闭第二个活动并重新打开它时(即使我调用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,则第二次启动活动。
感谢任何帮助。
答案 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;
时,最初会实例化,所以它永远不会回到假永远不会被摧毁。