2016-06-17 2 views
0

Я работаю над проектом с двумя действиями, один показывает список строк из базы данных, когда вы нажмете один, он открывает другую деятельность с формой, содержащей элементы, которые вы можете редактировать;Как обеспечить, чтобы finish() уничтожил активность и очистил все переменные?

Проблема в том, что когда я закрываю второе действие и снова открываю его (даже если я вызываю finish()), некоторые переменные сохраняют данные из последнего «сеанса».

Так может возникнуть вопрос: как я могу очистить все переменные/уничтожить активность?

EDIT

Как я продолжаю читать и пытаться я до сих пор не могу понять реальную проблему таким образом, есть некоторая дополнительная информация:

-Custom контроллеры Я использую

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 класс (также опробован нестатический

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

вам не нужно закончить вашу деятельность .. использовать setNotifyDataChange on adepter –

+0

читать о '' – xAqweRx

+0

set launchMode to standard может помочь – jfxu

ответ

0

В конце концов проблема не было ничего общего с андроидом, реальная проблема была CustomViewUtilities.edited; ведьма первоначально был создан каждый раз, когда private boolean edited=false; был повернут к статическому private static boolean edited=false;, чтобы он никогда не возвращался к ложному и никогда не разрушался.

0

Этого не должно быть, если вы сохранили все данные в своей деятельности. Если вы читаете данные извне Activity (класс приложения, непосредственно из базы данных или SharedPrefs, возможно), он останется таким, какой есть.

Если это не так, мое предложение было бы создать что-то вроде этого:

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

Вызова этого метода на активности OnDestroy метод

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 
} 
0
yourExistingActivity.finish(); // This **requests** for freeing the memory 

Обратите внимание, что деятельность вы вызываете метод отделки() из уничтожаются и все его ресурсы очереди для сбора мусора, и вся память, которая использовалась при этой деятельности будет быть освобожденным во время следующий цикл GC.

Если вы действительно хотите, чтобы отменить память как можно скорее, переопределить метод OnDestroy вашей деятельности:

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Runtime.getRuntime().gc();  //This is the key 
} 
0

Переопределить метод onDestroy() и в этом методе Просто позвоните finish() и Runtime.getRuntime().gc() методы ...

Все переменные должны быть назначены NULL ...

Мой код:

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    try{ 
     Runtime.getRuntime().gc(); 
     finish(); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 
Смежные вопросы