使用数组和文件的android内存泄漏

使用数组和文件的android内存泄漏,android,memory-leaks,Android,Memory Leaks,我正在使用/raw目录中的*.txt文件开发一个字典,而且我有一个历史记录(目前有18个条目) 每个OnResume()我从SD卡上的文件中获取历史记录条目并填充listary,然后使用ArrayAdapter填充ListView 我不明白为什么我有一个很大的内存泄漏(每次onResume()都会增加大约4-6MB的内存)。请帮帮我 这是我的密码: public class SecondTab extends Activity { ListView lv1; ArrayList <Stri

我正在使用/raw目录中的*.txt文件开发一个字典,而且我有一个历史记录(目前有18个条目)

每个
OnResume()
我从SD卡上的文件中获取历史记录条目并填充
listary
,然后使用
ArrayAdapter
填充
ListView

我不明白为什么我有一个很大的内存泄漏(每次
onResume()
都会增加大约4-6MB的内存)。请帮帮我

这是我的密码:

public class SecondTab extends Activity {
ListView lv1;
ArrayList <String> ArrayHist = new ArrayList <String>();
ArrayList <String> ArrayHistMin = new ArrayList <String>();
BufferedReader Buffer;
InputStream file;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.hist);

    SetContent();

    if (ru.andr.dictu.FirstTab.myErrorInHist)
    {
        Toast.makeText(this, getString(R.string.err_hist), Toast.LENGTH_LONG).show();
    }
}

public void SetContent()
{
    //show History entries
    //trying to solve memory leak
    try
    {
        ArrayHist.clear();
        ArrayHistMin.clear();
    }
    catch (Exception e){}
    ArrayHist=null;
    ArrayHistMin=null;
    ArrayHist = new ArrayList <String>();
    ArrayHistMin = new ArrayList <String>();
    Buffer=null;
    file=null;

if (ru.andr.dictu.FirstTab.myErrorInHist!=true) 
   {    
//filling arrays
    try {
        file = new FileInputStream(ru.andr.dictu.history_func.File_hist()); //getting name of file from common store
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    Buffer = new BufferedReader(new InputStreamReader(file));
    try {
        String Str;
        int counter_hist_content = 0;
        while ( (Str = Buffer.readLine()) != null){ //reading from history file
                String myTrimStr = Str.trim();
                ArrayHistMin.add(myTrimStr.substring(0, myTrimStr.indexOf(";;")).intern()); //main word
                ArrayHist.add(myTrimStr.substring(myTrimStr.indexOf(";;")+2).intern()); //ususaly translate
                if (counter_hist_content==50) break;//needs only 50 entries

                counter_hist_content++;
             }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try
    {
        //closing files, buffers
        file.reset();
        file.close();
        Buffer.reset();
        Buffer.close();
    }catch (Exception e) {}

   }
    lv1 = (ListView)findViewById(R.id.history);
    lv1.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item_hist, ArrayHistMin));
    lv1.setTextFilterEnabled(true);
    lv1.setOnItemClickListener(new OnItemClickListener() {
           public void onItemClick(AdapterView<?> a, View v, int position, long id) {
               changeClass (position , ArrayHist.get(position));

           }
    });

    lv1.setOnItemLongClickListener(new OnItemLongClickListener(){

        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            // TODO Auto-generated method stub
            ru.andr.dictu.myspeak.text=null;
            ru.andr.dictu.myspeak.text=ArrayHistMin.get(arg2);

            if (ru.andr.dictu.myspeak.text.indexOf("[")!=-1)
            ru.andr.dictu.myspeak.text=ru.andr.dictu.myspeak.text.substring(0,ru.andr.dictu.myspeak.text.indexOf("[")).intern();
            speakClass();

            return true;
        }


    });
}

public void speakClass() {
    Intent intent = new Intent();
    intent.setClass(this, myspeak.class);
    startActivity(intent);
}

public void changeClass(int position, String extArray) {
    Intent intent = new Intent();
    intent.setClass(this, List.class);
    intent.putExtra(List.results, extArray.toString().intern());
    startActivity(intent);
    getParent().overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
}
@Override  protected void onPause()  {super.onPause(); }
@Override
protected void onResume() 
{
    super.onResume();
    SetContent();
}
public class SecondTab扩展活动{
ListView lv1;
ArrayList ArrayList=新的ArrayList();
ArrayList ArrayHistMin=新的ArrayList();
缓冲读取缓冲区;
输入流文件;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.hist);
SetContent();
if(ru.andr.dictu.FirstTab.myErrorInHist)
{
Toast.makeText(this,getString(R.string.err_hist),Toast.LENGTH_LONG.show();
}
}
公共内容
{
//显示历史记录条目
//试图解决内存泄漏问题
尝试
{
ArrayHist.clear();
arrayhismin.clear();
}
捕获(例外e){}
ArrayHist=null;
ArrayHistMin=null;
ArrayList=新的ArrayList();
ArrayHistMin=新的ArrayList();
缓冲区=空;
file=null;
if(ru.andr.dictu.FirstTab.myErrorInHist!=真)
{    
//填充阵列
试一试{
file=newfileinputstream(ru.andr.dictu.history\u func.file\u hist());//从公共存储中获取文件名
}捕获(FileNotFoundException e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
Buffer=新的BufferedReader(新的InputStreamReader(文件));
试一试{
字符串Str;
int counter_hist_content=0;
而((Str=Buffer.readLine())!=null){//从历史文件读取
字符串myTrimStr=Str.trim();
arrayhismin.add(myTrimStr.substring(0,myTrimStr.indexOf(;;)).intern();//主单词
add(myTrimStr.substring(myTrimStr.indexOf(“;;”)+2.intern());//通常翻译
if(counter_hist_content==50)break;//只需要50个条目
计数器历史内容++;
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
尝试
{
//关闭文件、缓冲区
file.reset();
file.close();
reset();
Buffer.close();
}捕获(例外e){}
}
lv1=(ListView)findViewById(R.id.history);
lv1.setAdapter(新的ArrayAdapter(this,R.layout.list_item_hist,ArrayHistMin));
lv1.setTextFilterEnabled(true);
lv1.setOnItemClickListener(新的OnItemClickListener(){
公共视图单击(适配器视图a、视图v、内部位置、长id){
changeClass(position,ArrayHist.get(position));
}
});
lv1.setOnItemLongClickListener(新的OnItemLongClickListener(){
@凌驾
长单击(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
//TODO自动生成的方法存根
ru.andr.dictu.myspeak.text=null;
ru.andr.dictu.myspeak.text=arrayhismin.get(arg2);
if(ru.andr.dictu.myspeak.text.indexOf(“[”)!=-1)
ru.andr.dictu.myspeak.text=ru.andr.dictu.myspeak.text.substring(0,ru.andr.dictu.myspeak.text.indexOf(“[”).intern();
speakClass();
返回true;
}
});
}
public void speakClass(){
意图=新意图();
setClass(this,myspeak.class);
星触觉(意向);
}
公共void changeClass(int位置,字符串extArray){
意图=新意图();
intent.setClass(这个,List.class);
intent.putExtra(List.results,extArray.toString().intern());
星触觉(意向);
getParent().overridePendingTransition(R.anim.zoom\u进入,R.anim.zoom\u退出);
}
@重写受保护的void onPause(){super.onPause();}
@凌驾
受保护的void onResume()
{
super.onResume();
SetContent();
}

我猜新的InputStreamReader(文件)正在泄漏。您需要关闭此读取器。
如果这不能解决问题,则转储hprof数据并在eclipse中使用MAT工具进行检查。您可以指出哪个类占用最大堆


编辑:你可以在DDMS视图中转储hprof。它是显示进程的按钮之一

你看到这篇帖子了吗:那个家伙在没有调试器的情况下运行修复了漏洞。这不取决于调试器,我在手机上尝试我的应用程序,与PC断开连接。我还设置了manifest android:debuggable=“false”和同样的内容。