Android简单封装一个MVP基类流程详解

以下是Android简单封装一个MVP基类的流程:

第一步:创建BaseView和BasePresenter接口

BaseView接口中定义了通用的UI操作方法,例如显示进度条、隐藏进度条、显示错误信息等等。BasePresenter接口定义了通用的数据获取方法,例如获取数据、刷新数据等等。

下面是示例代码:

public interface BaseView {
    void showLoading();
    void hideLoading();
    void showError(String error);
}

public interface BasePresenter<T extends BaseView> {
    void attachView(T view);
    void detachView();
}

第二步:创建BaseActivity和BasePresenterImpl类

创建BaseActivity类,并实现BaseView接口,在其中定义通用的UI操作方法。其中需要将UI操作交给BasePresenterImpl类处理,BasePresenterImpl实现了BasePresenter接口,将具体的数据获取方法交给了子类实现。

下面是示例代码:

public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity implements BaseView {

    protected T mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        mPresenter = createPresenter();
        mPresenter.attachView(this);
        initView();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPresenter.detachView();
    }

    protected abstract int getLayoutId();

    protected abstract T createPresenter();

    protected abstract void initView();

    @Override
    public void showLoading() {
        // 显示进度条
    }

    @Override
    public void hideLoading() {
        // 隐藏进度条
    }

    @Override
    public void showError(String error) {
        // 显示错误信息
    }
}

public abstract class BasePresenterImpl<T extends BaseView> implements BasePresenter<T> {

    protected T mView;

    @Override
    public void attachView(T view) {
        mView = view;
    }

    @Override
    public void detachView() {
        mView = null;
    }
}

第三步:创建具体的Presenter

创建具体的Presenter类,继承自BasePresenterImpl,并实现具体的数据获取方法。例如,以下是获取天气信息的Presenter示例代码:

public class WeatherPresenter extends BasePresenterImpl<WeatherView> {

    public void getWeather(String city) {
        mView.showLoading();

        // 发送网络请求获取天气信息

        mView.hideLoading();
        mView.showWeatherInfo(weatherInfo);
    }
}

第四步:创建具体的View

创建具体的View类,继承自BaseActivity,并实现具体的UI操作方法。例如,以下是显示天气信息的View示例代码:

public class WeatherActivity extends BaseActivity<WeatherPresenter> implements WeatherView {

    @Override
    protected int getLayoutId() {
        return R.layout.activity_weather;
    }

    @Override
    protected WeatherPresenter createPresenter() {
        return new WeatherPresenter();
    }

    @Override
    protected void initView() {
        // 初始化UI控件
    }

    @Override
    public void showWeatherInfo(WeatherInfo weatherInfo) {
        // 显示天气信息
    }
}

示例1:获取天气信息

现在我们已经完成了MVP基类的封装,接下来就可以用具体的示例来演示如何获取天气信息。

首先,我们需要在WeatherPresenter中添加获取天气信息的方法:

public class WeatherPresenter extends BasePresenterImpl<WeatherView> {

    public void getWeather(String city) {
        mView.showLoading();

        // 发送网络请求获取天气信息
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.weather.com.cn/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        WeatherService weatherService = retrofit.create(WeatherService.class);
        Call<WeatherInfo> call = weatherService.getWeather(city);
        call.enqueue(new Callback<WeatherInfo>() {
            @Override
            public void onResponse(Call<WeatherInfo> call, Response<WeatherInfo> response) {
                mView.hideLoading();
                mView.showWeatherInfo(response.body());
            }

            @Override
            public void onFailure(Call<WeatherInfo> call, Throwable t) {
                mView.hideLoading();
                mView.showError("获取天气信息失败:" + t.getMessage());
            }
        });
    }
}

然后,在WeatherActivity中调用getWeather方法,例如在按钮的点击事件中:

public class WeatherActivity extends BaseActivity<WeatherPresenter> implements WeatherView {

    @BindView(R.id.city_edit_text)
    EditText cityEditText;
    @BindView(R.id.search_button)
    Button searchButton;

    @Override
    protected int getLayoutId() {
        return R.layout.activity_weather;
    }

    @Override
    protected WeatherPresenter createPresenter() {
        return new WeatherPresenter();
    }

    @Override
    protected void initView() {
        ButterKnife.bind(this);
        searchButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String city = cityEditText.getText().toString();
                mPresenter.getWeather(city);
            }
        });
    }

    ...
}

示例2:获取新闻列表

接下来,我们使用另外一个示例演示如何获取新闻列表。

首先,我们需要创建NewsPresenter类,实现具体的数据获取方法:

public class NewsPresenter extends BasePresenterImpl<NewsView> {

    public void getNewsList(int pageIndex) {
        mView.showLoading();

        // 发送网络请求获取新闻列表
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://api.xxx.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        NewsService newsService = retrofit.create(NewsService.class);
        Call<List<News>> call = newsService.getNewsList(pageIndex);
        call.enqueue(new Callback<List<News>>() {
            @Override
            public void onResponse(Call<List<News>> call, Response<List<News>> response) {
                mView.hideLoading();
                mView.showNewsList(response.body());
            }

            @Override
            public void onFailure(Call<List<News>> call, Throwable t) {
                mView.hideLoading();
                mView.showError("获取新闻列表失败:" + t.getMessage());
            }
        });
    }
}

然后,在NewsActivity中调用getNewsList方法,例如在onCreate方法中:

public class NewsActivity extends BaseActivity<NewsPresenter> implements NewsView {

    private RecyclerView mRecyclerView;
    private NewsAdapter mNewsAdapter;

    @Override
    protected int getLayoutId() {
        return R.layout.activity_news;
    }

    @Override
    protected NewsPresenter createPresenter() {
        return new NewsPresenter();
    }

    @Override
    protected void initView() {
        mRecyclerView = findViewById(R.id.recycler_view);
        mNewsAdapter = new NewsAdapter(this);
        mRecyclerView.setAdapter(mNewsAdapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        mPresenter.getNewsList(0);
    }

    @Override
    public void showNewsList(List<News> newsList) {
        mNewsAdapter.setNewsList(newsList);
    }

    ...
}

以上就是Android简单封装一个MVP基类的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android简单封装一个MVP基类流程详解 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • Android控件系列之ImageView使用方法

    Android控件系列之ImageView使用方法 简介 ImageView是Android中常用的控件之一,用于显示图片。本攻略将详细介绍ImageView的使用方法。 步骤 步骤1:在布局文件中添加ImageView 首先,在你的布局文件中添加一个ImageView控件。可以使用以下代码示例: <ImageView android:id=\&quo…

    other 2023年8月26日
    00
  • 解决Golang小数float64在实际工程中加减乘除的精度问题

    一、背景 在实际工程开发中,我们经常会遇到计算金融、税费等场景,这时我们需要使用小数进行加减乘除等运算。而Golang使用float64存储小数,但是在精度计算中由于二进制存储特性,可能会出现不精确的情况。以下是如何解决Golang小数float64在实际工程中加减乘除的精度问题的完整攻略。 二、解决方案 1.使用Decimal等高精度计算库 Golang中…

    other 2023年6月27日
    00
  • unity3d游戏地图生成器mapmagicworldgeneratorv1.9.1

    以下是Unity3D游戏地图生成器MapMagic World Generator v1.9.1的完整攻略,包括以下步骤: 下载和安装MapMagic World Generator 创建一个新的地图生成器 添加地形生成器 配置地形生成器 生成地图 示例说明 步骤一:下载和安装MapMagic World Generator 在开始使用MapMagic Wo…

    other 2023年5月9日
    00
  • mac更换鼠标指针样式_mousecape教程

    以下是关于“Mac更换鼠标指针样式_Mousecape教程”的完整攻略: 什么是Mousecape? Mousecape是一款Mac应用程序,它可以帮助您更改鼠标指针的样式。它提供了一个简单的界面,可以让您选择和安装各种鼠标指针主题。 如何使用Mousecape更换鼠标指针样式? 使用Mousecape更换鼠标指针样式的步骤如下: 下载和安装Mousecap…

    other 2023年5月6日
    00
  • vant中的picker选择器自定义选项内容

    首先,我们需要了解vant picker选择器的基本使用方法。vant picker选择器的用法可以参考官方文档:https://vant-contrib.gitee.io/vant/#/zh-CN/picker。 基本用法是:将Picker组件包裹在van-popup中,然后再在Picker组件中写入需要选择的选项。然后根据需要定义选择事件和取消事件。如下…

    other 2023年6月25日
    00
  • Android Studio连接天天模拟器

    Android Studio连接天天模拟器的完整攻略 天天模拟器是一款常用的 Android 模拟器,可以用于开发和测试 Android 应用程序。本文将为您提供一份 Android Studio 连接天天模拟器的完整攻略,包括安装天天模拟器、配置 Android Studio 和连接天天模拟器等方面的内容,同时提供两个示例说明。 安装天天模拟器 在连接天天…

    other 2023年5月5日
    00
  • pxcook(像素大厨)

    PxCook(像素大厨)攻略 PxCook(像素大厨)是一款设计师必备的UI设计工具,它可以帮助设计师快速生成设计稿的标注、切图、交互等工作,提高设计效率。下面是PxCook的完整攻略,包括安装、使用和示例说明。 安装 PxCook支持Windows和MacOS系统,可以在官网下载安装包进行安装。安装完成后,打开PxCook,输入注册码或使用试用版即可开始使…

    other 2023年5月5日
    00
  • 超详细的maven使用教程

    超详细的Maven使用教程 Maven 是一款常用的 Java 项目管理工具,它可以帮助简化项目的构建、依赖管理等过程,有助于提高开发效率。本文将详细介绍 Maven 的安装与配置、基本命令使用、依赖管理、打包发布等方面的内容,帮助读者了解和掌握 Maven 的使用。 安装与配置 安装 JDK Maven 是一个基于 Java 语言开发的项目管理工具,所以需…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部