失败的 Binder 事务文本文件

Posted

技术标签:

【中文标题】失败的 Binder 事务文本文件【英文标题】:Failed Binder Transaction text file 【发布时间】:2012-05-27 17:57:18 【问题描述】:

我必须从 96000 字节的文本文件中读取一些数据,以便绘制折线图。我尝试读取每 2 个字节并将它们组合成 2 个字节,然后我制作了 8 个数组,每个数组有 6000 个整数。但是我遇到了上述错误! 如果我尝试只使用 1,2 或 3 个数组,它可以工作,但从 4 个数组不能

谁能帮我看看我哪里做错了。 我从昨天阅读了不同的讨论,并没有真正看到任何合适的答案。 我得到的是内存/堆的问题。

这是我的代码。

byte LSB;
     byte MSB;
    public  Intent getIntent(Context context) throws IOException
        InputStream data_in ;

            data_in = context.getAssets().open("demodta.txt");

             int[] x = new int[6000]; // x values
             int[] y1= new int[6000]; // y1 values
             int[] y2= new int[6000]; // y2 values
             int[] y3= new int[6000]; // y3 values
             int[] y4= new int[6000]; // y4 values
             int[] y5= new int[6000]; // y5 values
             int[] y6= new int[6000]; // y6 values
             int[] y7= new int[6000]; // y7 values
             int[] y8= new int[6000]; // y8 values  
             int i =0;


//      while(true) 
    int j=0;
         try 

         int size = data_in.available();
         byte[] buffer = new byte[size];
         data_in.read(buffer);

             for( i=0;i<12000;i=i+2)                
                 LSB =  buffer[i];
                 MSB = buffer[i+1];
                  int current= ((MSB<<8)| (LSB & 0xFF));
                y1[j]=  current;
                j++;
              
                j=0;
             for(i=12000;i<24000;i=i+2)
                LSB =  buffer[i];
                MSB = buffer[i+1];
                int current= ((MSB<<8)| (LSB & 0xFF));
                y2[j]=  current;
                j++;
              
             j=0;
             for(i=24000;i<36000;i=i+2)
                LSB =  buffer[i];
                 MSB = buffer[i+1];
                 int current= ((MSB<<8)| (LSB & 0xFF));
                 y3[j]=  current;
                 j++;
               
             j=0;
             for(i=36000;i<48000;i=i+2)
                LSB =  buffer[i];
                 MSB = buffer[i+1];
                 int current= ((MSB<<8)| (LSB & 0xFF));
                 y4[j]=  current;
                 j++;
               
             j=0;
             for(i=48000;i<60000;i=i+2)
                LSB =  buffer[i];
                 MSB = buffer[i+1];
                 int current= ((MSB<<8)| (LSB & 0xFF));
                 y5[j]=  current;
                 j++;
               
             j=0;
             for(i=60000;i<72000;i=i+2)
                LSB =  buffer[i];
                 MSB = buffer[i+1];
                 int current= ((MSB<<8)| (LSB & 0xFF));
                 y6[j]=  current;
                 j++;
               
             j=0;
             for(i=72000;i<84000;i=i+2)
                LSB =  buffer[i];
                 MSB = buffer[i+1];
                 int current= ((MSB<<8)| (LSB & 0xFF));
                 y7[j]=  current;
                 j++;
               
             j=0;
             for(i=84000;i<96000;i=i+2)
                LSB =  buffer[i];
                 MSB = buffer[i+1];
                 int current= ((MSB<<8)| (LSB & 0xFF));
                 y8[j]=  current;
                 j++;
               
         

 for(int k=0;k<6000;k++)
     x[k]=k;
    

        TimeSeries series1 = new TimeSeries("line1");
        for(int k=0;k<x.length;k++)
            series1.add(x[k], y1[k]);
        
        TimeSeries series2 = new TimeSeries("line2");
        for(int k=0;k<x.length;k++)
            series2.add(x[k], y2[k]);
        
        TimeSeries series3 = new TimeSeries("line3");
        for(int k=0;k<x.length;k++)
            series3.add(x[k], y3[k]);
        
        TimeSeries series4 = new TimeSeries("line4");
        for(int k=0;k<x.length;k++)
            series4.add(x[k], y4[k]);
        
        TimeSeries series5 = new TimeSeries("line5");
        for(int k=0;k<x.length;k++)
            series5.add(x[k], y5[k]);
        
        TimeSeries series6 = new TimeSeries("line6");
        for(int k=0;k<x.length;k++)
            series6.add(x[k], y6[k]);
        
        TimeSeries series7 = new TimeSeries("line7");
        for(int k=0;k<x.length;k++)
            series7.add(x[k], y7[k]);
        
        TimeSeries series8 = new TimeSeries("line8");
        for(int k=0;k<x.length;k++)
            series8.add(x[k], y8[k]);
        

这是我的 MainActivity

public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button strt = (Button) findViewById(R.id.LineGraph);

        strt.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View v) 
                lineGraph line = new lineGraph();

                Intent lineIntent = null;
                try 
                    lineIntent = line.getIntent(getBaseContext());
                 catch (IOException e) 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                


                startActivity(lineIntent);

            
        );
    

我的 LogCat 给出以下输出:

05-27 19:39:00.180: D/dalvikvm(5556): GC_FOR_ALLOC freed 0K, 10% free 14410K/15879K, paused 68ms
05-27 19:39:00.750: D/dalvikvm(5556): GC_FOR_ALLOC freed 961K, 16% free 13452K/15879K, paused 72ms
05-27 19:39:00.830: D/dalvikvm(5556): GC_FOR_ALLOC freed 0K, 10% free 14348K/15879K, paused 77ms
05-27 19:39:00.830: I/dalvikvm-heap(5556): Grow heap (frag case) to 14.945MB for 917520-byte allocation
05-27 19:39:00.920: D/dalvikvm(5556): GC_FOR_ALLOC freed 0K, 10% free 15244K/16839K, paused 78ms
05-27 19:39:01.320: D/dalvikvm(5556): GC_FOR_ALLOC freed 1206K, 15% free 14407K/16839K, paused 74ms
05-27 19:39:01.320: I/dalvikvm-heap(5556): Grow heap (frag case) to 15.643MB for 1589467-byte allocation
05-27 19:39:01.410: D/dalvikvm(5556): GC_FOR_ALLOC freed <1K, 14% free 15958K/18439K, paused 73ms
05-27 19:39:01.420: E/JavaBinder(5556): !!! FAILED BINDER TRANSACTION !!!

【问题讨论】:

你的 demodta.txt 文件的大小是多少?? 你不能重用数组吗..你没有剩余的堆内存.. 怎么样?我该怎么做才能释放堆。因为文件的大小太小,我不认为是导致问题的人! 您的数组导致堆已满。您正在分配大约 54k 的内存.. 你能给我一个提示吗?我该怎么做!!! 【参考方案1】:

你不能这样吗..

 for( i=0;i<12000;i=i+2) y1[j]= current; j++; 
 TimeSeries series1 = new TimeSeries("line1"); 
for(int k=0;k<x.length;k++) series1.add(x[k], y1[k]);  
 for(i=12000;i<24000;i=i+2) y1[j]= current; j++;  

【讨论】:

以上是关于失败的 Binder 事务文本文件的主要内容,如果未能解决你的问题,请参考以下文章

javabinder,失败的 BINDER 事务 - setImageViewBitmap(..) [重复]

由于失败的 Binder 事务,Appwidget 无法更新

调试断言失败文件、tokenScanner 和文本文件

由于数字格式为文本,将 Excel 文件读取到 Python 失败

如何在付款失败最多的文本文件中查找节点

查询通过 prometheus 节点导出器文本文件收集器公开的自定义指标失败