MVC架构设计与经典三层模型
16lz
2021-01-24
在android当中,mvc具体怎么对应关系了
m 对应的 android javaBeanv 对应的是 android中布局layout.xmlc 对应的是 android中的 Activity
MVC弊端
1 依赖关系紧密,耦合度高,可维护性不强
2 容易造成内存泄漏,我们先写个demo来看看,demo很简单,界面上一个按钮,一个imageview,点击按钮从网络上下载一张图片显示在imageview上
上代码
xml v 层
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context=".MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="getImage" android:text="获取图片" /> <ImageView android:id="@+id/image" android:layout_width="100dp" android:layout_height="100dp" /></LinearLayout>
ImageBean M 层
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; }}
CallBack 回调接口
public interface CallBack{ /** * * @param resultCode 请求结果返回表示 * @param imageBean Model层数据中bitmap返回对象 */ void callBack(int resultCode,ImageBean imageBean);}
ImageDownLoader 下载封装类
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; 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 error, Bitmap bitmap) { if (callBack != null) { imageBean.setBitmap(bitmap); callBack.callBack(error, imageBean); } } }}
MainActivity 就是我们的 C 层
public class MainActivity extends AppCompatActivity implements CallBack{ private static final String path = "https://00imgmini.eastday.com/mobile/20191110/20191110082703_a92d66ea5d2c0b95575ea15128588762_1.jpeg"; private ImageView imageView; @SuppressLint("HandlerLeak") private Handler handler=new Handler() { @Override public void 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; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView=findViewById(R.id.image); } 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); }}
效果
在onCreate方法中添加几行代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView=findViewById(R.id.image); new Thread(new Runnable() { @Override public void run() { SystemClock.sleep(5000); } }).start(); }
查看内存信息
可以看到MainActivity里面是存在内存泄漏的
更多相关文章
- MVP+RxJava+Dagger打造的Android(安卓)Album
- Android(安卓)Surfaceflinger 的使用
- android HandlerThread使用小例
- Android手动回收bitmap,引发Canvas: trying to use a recycled b
- 写一个android小闹钟
- android:drawableLeft的Button不能切换图片问题之解决办法
- android 应用程序自适应屏幕大小
- [置顶] editext文本输入框 软键盘下个按钮的问题
- android 图片浏览器 APP 源码