在Android中的默认架构模式就MVC,但是为什么会有MVP呢?主要原因是内存泄漏,接下来我们就一起来分析MVC在内存中的泄漏情况
首先我们把MVC的代码写好 进行测试 案例是一个简单的获取图片的demo
public class MainActivity extends Activity implements Callback {
private ImageView imageView;
private final static String PATH = "https://imgconvert.csdnimg.cn/aHR0cHM6Ly9mb3J1bS5taWFuYmFvYmFuLmNuL2RhdGEvYXR0YWNobWVudC9mb3J1bS8yMDE4MDMvMjAvMTQwMTUzaTc1NjJleHpqcm5hZ2FqYS5naWY";
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case ImageDownloader.SUCCESS: // 成功
imageView.setimageBitmap((Bitmap) msg.obj);
break;
case ImageDownloader.ERROR: // 失败
Toast.makeText(MainActivity.this, "下载失败", Toast.LENGTH_SHORT).show();
break;
}
return false;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.iv_image);
// 内存泄漏
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(50000);
}
}).start();
}
// 点击事件
public void getimage(View view) {
ImageBean imageBean = new ImageBean();
imageBean.setRequestPath(PATH);
new ImageDownloader().down(this, imageBean);
}
@Override
public void callback(int resultCode, ImageBean imageBean) {
Message message = handler.obtainMessage(resultCode);
message.obj = imageBean.getBitmap();
handler.sendMessageDelayed(message, 500);
}
}
public interface Callback {
/**
* @param resultCode 请求结果返回标识码
* @param imageBean Model层数据中bitmap对象(用于C层刷新V)
*/
void callback(int resultCode, ImageBean imageBean);
}
public class ImageBean {
// 网络图片地址
private String requestPath;
// 结果返回bitmap对象
private Bitmap bitmap;
public String getRequestPath() {
return requestPath;
}
public void setRequestPath(String requestPath) {
this.requestPath = requestPath;
}
public Bitmap getBitmap() {
return bitmap;
}
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
}
}
public class ImageDownloader {
// 成功
static final int SUCCESS = 200;
// 失败
static final int ERROR = 404;
public void down(Callback callback, ImageBean imageBean) {
new Thread(new DownLoader(callback, imageBean)).start();
}
static final class DownLoader implements Runnable {
private final Callback callback;
private final ImageBean imageBean;
public DownLoader(Callback callback, ImageBean imageBean) {
this.callback = callback;
this.imageBean = imageBean;
}
@Override
public void run() {
try {
URL url = new URL(imageBean.getRequestPath());
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.setRequestMethod("GET");
if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream inputStream = httpURLConnection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
showUi(SUCCESS, bitmap);
} else {
showUi(ERROR, null);
}
} catch (Exception e) {
e.printstacktrace();
showUi(ERROR, null);
}
}
private void showUi(int resultCode, Bitmap bitmap) {
if (callback != null) {
imageBean.setBitmap(bitmap);
callback.callback(resultCode, imageBean);
}
}
}
}
在MianActivity中 我们在onCreat()方法中故意写了内存泄漏的代码 ,一旦用户退出了 MainAvtivity 还会持有对象 如下内存分析情况
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。