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的开发者们有什么好的建议....求拯救