• Adnroid一个例子引发的思考


      12年11月1日开始学Android到现在,一直开发Android应用也一年半了,随着接触的东西越来越多,需求越来越繁杂要求也越来越高,渐渐的发现很多这种情况:

      1.同样的写法在自己手机上面正确运行,换一个手机就不行。

      比如我写了个layout_marginLeft=12dp,在米3正确运行,到了三星N7000(2.3.5)就没用了,显示完全错位,换成paddingLeft=12dp马上就好了。boss经常问我为什么你手机行,我手机这里不行,其他手机会不会出问题?我无言以对。(经常有这种情况)

      2.分享一张图片,到微信朋友圈就很模糊。

      ios那边分享一张200多k的图片,下载下来还是原图,我分享一张50多k的图片,下载下来32k,完全模糊了,而且超过60k就不能分享了。然后别人就说我代码的问题,ios那边都可以,我也无言以对(就几行代码),至今没找到解决办法。

      3.屏幕适配的问题

       有些界面放在大屏幕手机和小屏幕手机完全不同,最后不得不全部用代码根据屏幕比例来设置宽高位置。boss又说,为什么ios的那么好看,我折腾这么久,我也无言以对。

       到底是自己技术不行,经验不足,还是对于Android知道的太少,又或是Android开发就是这样修修补补,折腾来折腾去,勉勉强强运行?有多少人对自己写的Android程序有信心不报错?

       我写了一个demo,程序有两个Activity切换,第一个界面加载一张图,点击进入第二个界面,第二个界面点击回到第一个界面,就这么简单

       要加载的图片:

      

    图片大小:960x800   184Kb

      MainActivity:

    public class MainActivity extends Activity {
    	private ImageView iv;
    	private Bitmap bmp = null;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		iv = (ImageView) findViewById(R.id.main_iv);
    		try {
    			InputStream in = getAssets().open("test.jpg");
    			bmp = BitmapFactory.decodeStream(in);
    			in.close();
    			iv.setImageBitmap(bmp);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public void onclickStart(View v) {
    		startActivity(new Intent(this, TwoActivity.class));
    		finish();
    		if (null != bmp && !bmp.isRecycled()) {
    			bmp.recycle();
    			bmp = null;
    			System.gc();
    		}
    	}
    
    	@Override
    	public void finish() {
    		super.finish();
    		Log.i("test_info", "finish():");
    	}
    

      TowActivity:

    public class TwoActivity extends Activity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    	}
    
    	@Override
    	public boolean onTouchEvent(MotionEvent event) {
    		startActivity(new Intent(this, MainActivity.class));
    		finish();
    		return super.onTouchEvent(event);
    	}
    }
    

      这个界面点击下就会启动主界面,自己finish

    然后问题来了,启动程序,来回点20次不到就发生OOM了,问题是我图片不是已经释放了吗?

    下面是米3这个程序的内存使用情况,刚打开时:

    来回点了四五次后

    十次左右后:发现占用对内存越来越大,占用的比例越来越多

    直到接近128M,使用率99%

    最后总共点了二十多次,就OOM了,程序顺利崩溃

    至此,我已经不敢写代码了,加载一张200k的图片,来回点20次就崩溃,图片释放了吗,释放了,界面释放了吗,释放了,为什么最后还是内存溢出?我无言以对!!

    以后还敢让别人来回点你的程序吗?以后还敢加载几百k的图片吗?我已经没有任何底气了.......

    不知道同为Android的开发者们有什么好的建议....求拯救

  • 相关阅读:
    Unity UGUI
    机器学习:logistic回归与Softmax回归 代码+案例
    机器学习:线性回归 代码+测试
    《算法竞赛进阶指南》0x33同余 扩展欧几里得解线性同余方程组
    《算法竞赛进阶指南》0x33同余 POJ1845 乘方约数和取模
    《算法竞赛进阶指南》0x33同余 POJ3696 The Luckies Number
    《算法竞赛进阶指南》0x32欧拉函数 POJ3090 Visible Lattice Points
    《算法竞赛进阶指南》0x32约数 解公因数以及公倍数方程
    《算法竞赛进阶指南》0x32约数 余数之和
    《算法竞赛进阶指南》0x32约数
  • 原文地址:https://www.cnblogs.com/pursuege/p/3975742.html
Copyright © 2020-2023  润新知