Adnroid一个例子引发的思考

时间:2021-08-03 16:09:55

  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切换,第一个界面加载一张图,点击进入第二个界面,第二个界面点击回到第一个界面,就这么简单

   要加载的图片:

  Adnroid一个例子引发的思考

图片大小: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这个程序的内存使用情况,刚打开时:

Adnroid一个例子引发的思考

来回点了四五次后

Adnroid一个例子引发的思考

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

Adnroid一个例子引发的思考

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

Adnroid一个例子引发的思考

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

Adnroid一个例子引发的思考

 

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

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

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