2016-01-09 3 views
0

Я попытался очистить кэш-память через кнопку в моем приложении, используя приведенный ниже код.
activity_main.xmlНевозможно очистить память кэша Программно Android

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:id="@+id/textView" /> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/editText" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Save" 
     android:id="@+id/button" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Delete Cache" 
     android:id="@+id/button2" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Retrive Data" 
     android:id="@+id/button3" /> 
</LinearLayout> 

MainActivity.java

public class MainActivity extends AppCompatActivity { 
TextView t1; 
EditText et1; 
Button b1,b2,b3; 
public static final String PREFS_NAME = "MyPrefsFile"; 
SharedPreferences settings; 
SharedPreferences.Editor editor; 
private static MainActivity instance; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    settings = getSharedPreferences(MainActivity.PREFS_NAME, 0); 
    editor= settings.edit(); 
    instance=this; 
    t1=(TextView)findViewById(R.id.textView); 
    et1=(EditText)findViewById(R.id.editText); 
    b1=(Button)findViewById(R.id.button); 
    b2=(Button)findViewById(R.id.button2); 
    b3=(Button)findViewById(R.id.button3); 
    b1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      editor.putString("editText",et1.getText().toString()); 
      editor.commit(); 
      t1.setText(settings.getString("editText",null)); 
     } 
    }); 
    b2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      t1.setText(""); 
      MainActivity.getInstance().clearApplicationData(); 
         } 
    }); 
    b3.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      t1.setText(settings.getString("editText",null)); 
     } 
    }); 
} 
public static MainActivity getInstance(){ return instance;} 
public void clearApplicationData(){ 
     File cache= getCacheDir(); 
     File appDir=new File(cache.getParent()); 
     if(appDir.exists()){ 
      String[] children = appDir.list(); 
      for(String s: children){ 
       if(!s.equals("lib")){ 
        deleteDir(new File(appDir,s)); 
        Log.i("TAG", "File /data/data/APP_PACKAGE/ " + s +" DELETED"); 
       } 
      } 
     } 
} 
public static boolean deleteDir(File dir) { 
    if (dir != null && dir.isDirectory()) { 
     String[] children = dir.list(); 
     for (int i = 0; i < children.length; i++) { 
      boolean success = deleteDir(new File(dir, children[i])); 
      if (!success) { 
       return false; 
      } 
     } 
     return dir.delete(); 
    } 
    else { 
     return false; 
    } 
}} 

Explaination:
Во время нажатия Сохранить кнопки значения набрано в EditText будет сохранено в общего Предпочтения. При нажатии Удалить кеш записанный код для удаления кэш-памяти с Refer 1, Refer 2. Пока нажмите Retrive значение, хранящееся в . Общее предпочтение будет извлечено и отображено в TextView.

Issue: Хотя нажав Delete Cache в моей LogCat его, показывая, что кэш-памяти удалены и shared_prefs удален но мой размер кэш-памяти не уменьшается. При нажатии Retrive Значение от Общее предпочтение восстанавливается и отображается в TextView, но значение должно быть удалено.
Мой LogCat:

01-09 17:02:26.872 24290-24290/? I/TAG: File /data/data/APP_PACKAGE/ cache DELETED 
01-09 17:02:26.872 24290-24290/? I/TAG: File /data/data/APP_PACKAGE/ shared_prefs DELETED 

Я не знаю, что я missed.please помощь me.thank вы

ответ

2

OnStop() и onDestroy() включают в свою деятельность. Ваша активность OnDestroy() добавить следующий код

@Override 
    protected void onStop(){ 
    super.onStop(); 
    } 
// after the OnStop() state 


    @Override 
    protected void onDestroy() { 
    super.onDestroy(); 
    try { 
    trimCache(this); 
     } catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    } 

, а затем добавьте следующие методы

public static void trimCache(Context context) { 
    try { 
    File dir = context.getCacheDir(); 
    if (dir != null && dir.isDirectory()) { 
     deleteDir(dir); 
    } 
    } catch (Exception e) { 
    // TODO: handle exception 
    } 
} 

public static boolean deleteDir(File dir) { 
    if (dir != null && dir.isDirectory()) { 
    String[] children = dir.list(); 
    for (int i = 0; i < children.length; i++) { 
     boolean success = deleteDir(new File(dir, children[i])); 
     if (!success) { 
      return false; 
     } 
    } 
    } 

    // The directory is now empty so delete it 
    return dir.delete(); 
} 
+0

Я хочу очистить кеш при нажатии кнопки. Я заменил ваши trimCache() и dleteDir(). еще нет улучшения – GIRIDHARAN

+0

Вы включили onDestroy() в свою деятельность? – sasikumar

+0

Я надул onDestroy() нужен! вызвать trimCache() внутри onClick()? но я не хочу закрывать свою деятельность. – GIRIDHARAN

0

этот код будет удалять кэш

public static void deleteCache(Context context) { 
    try { 
     File dir = context.getCacheDir(); 
     if (dir != null && dir.isDirectory()) { 
      deleteDir(dir); 
     } 
    } catch (Exception e) {} 
} 

public static boolean deleteDir(File dir) { 
    if (dir != null && dir.isDirectory()) { 
     String[] children = dir.list(); 
     for (int i = 0; i < children.length; i++) { 
      boolean success = deleteDir(new File(dir, children[i])); 
      if (!success) { 
       return false; 
      } 
     } 
    } 
    return dir.delete(); 
} 
+0

наш код похож. и попробовал ваш код также не улучшился. – GIRIDHARAN

Смежные вопросы