Giter VIP home page Giter VIP logo

xdroidmvp's Introduction

#XDroidMvp 轻量级的Android MVP快速开发框架

概述

XDroidMvpXDroidAndroid快速开发框架的MVP版本,其使用方式类似于XDroid,大部分源码也来自XDroid

XDroidMvp全新文档https://github.com/limedroid/XDroidMvp/wiki

XDroidMvp主要会有这些特性:

无需写Contract! 无需写Present接口! 无需写View接口!

新增:

  • Mvp实现
  • RxJava & RxAndroid
  • 权限适配 RxPermission
  • 事件订阅默认采用 RxBus
  • 网络交互:
    • Retrofit + rx
    • Https
    • 统一异常处理
    • 缓存
    • 支持多个baseUrl
    • 。。。。
  • 无需担心rx内存泄漏
  • 适配AndroidX,请前往android-x分支

保留:

  • 提供XActivityXFragmentSimpleRecAdapterSimpleListAdapter等基类,可快速进行开发
  • 完整封装XRecyclerView,可实现绝大部分需求
  • XStateControllerXRecyclerContentLayout实现loading、error、empty、content四种状态的自由切换
  • 实现了MemoryDiskSharedPreferences三种方式的缓存,可自由扩展
  • 内置了RxBus,可自由切换到其他事件订阅库
  • 内置Glide,可自由切换其他图片加载库
  • 可输出漂亮的Log,支持JsonXmlThrowable等,蝇量级实现
  • 内置链式路由
  • 内置常用工具类:packagerandomfile...,提供的都是非常常用的方法
  • 内置加密工具类 XCodec,你想要的加密姿势都有

先睹为快

你可以这么使用:

BasePagerFragment

public abstract class BasePagerFragment extends XFragment<PBasePager>{

   @Override
    public void initData(Bundle savedInstanceState) {
        getP().loadData(getType(), 1);	//调用P方法
    }

   public void showData(int page, GankResults model) {
        if (page > 1) {
            getAdapter().addData(model.getResults());
        } else {
            getAdapter().setData(model.getResults());
        }

        contentLayout.getRecyclerView().setPage(page, MAX_PAGE);

        if (getAdapter().getItemCount() < 1) {
            contentLayout.showEmpty();
            return;
        }
    }
    
	 @Override
    public PBasePager newP() {
        return new PBasePager();
    }}
    
    @Override
    public int getLayoutId() {
        return R.layout.fragment_base_pager;
    }

PBasePager

public class PBasePager extends XPresent<BasePagerFragment> {
    protected static final int PAGE_SIZE = 10;


    public void loadData(String type, final int page) {
        Api.getGankService().getGankData(type, PAGE_SIZE, page)
                .compose(XApi.<GankResults>getApiTransformer())
                .compose(XApi.<GankResults>getScheduler())
                .subscribe(new ApiSubcriber<GankResults>() {
                    @Override
                    protected void onFail(NetError error) {
                        getV().showError(error); //调用V方法
                    }

                    @Override
                    public void onNext(GankResults gankResults) {
                        getV().showData(page, gankResults);
                    }
                });
    }
}

Get Started

使用,仅需四步:

step1

clone 'XDroid'库到本地:

git clone https://github.com/limedroid/XDroidMvp.git

step2

mvp作为依赖库,在您的app module 中 添加如下依赖:

compile project(':mvp')

step3

拷贝conf.gradle到您的项目根目录,并修改项目gradle文件下引入:

apply from: "conf.gradle"

并添加:

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

step4

修改XDroidConf配置类,主要针对log、cache、router、imageloader。若采用默认配置,此步骤可略过.

第二种方式,通过JitPack引入

step1 在根目录的gradle文件中配置:

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

step2 添加依赖:

dependencies {
	   implementation 'com.github.limedroid:XDroidMvp:v2.0.1'
}

Demo效果

重要说明

  • ButterKnife使用的是8.4.0版本,重点是 @BindView,可以去项目官网查看。
  • Rxlifecycle使用的是1.0版本,具体如何使用可以查看官网。
  • RxPermissions使用的是0.9.1版本,具体如何使用可以查看官网。
  • retrofit,具体如何使用可以查看官网。

更新日志

  • 2017-04-23,新增proguard rules,upgrade to rx2
  • 2016-12-23,新增mvp、base、cache、event、imageloader、log、router
  • 2016-12-25,新增rxJava、rxAndroid、rxlifecycle、rxpermission、rxbus、net(retrofit)
  • 2016-12-26,新增网络异常统一处理
  • 2016-12-28,重构MVP
  • 2016-12-30,重构网络层
  • 2016-12-31,新增Demo

TODO

  • rx
  • retrofit
  • rxpermission
  • rxbus
  • cache
  • wiki
  • demo

Star History

Star History Chart

About Me

Email : [email protected]

XDroid交流群:153569290

XDroid MVC版本XDroid

若您在使用过程中遇到任何问题,欢迎加入 153569290 群或者是邮件反馈,谢谢您的关注。XDroidMvp会持续维护,如果喜欢,记得star fork。

xdroidmvp's People

Contributors

dengciping0716 avatar limedroid avatar sum41forever avatar wenghaobin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xdroidmvp's Issues

导入后编译错误

Error:Execution failed for task ':mvp:compileReleaseJavaWithJavac'.

Compilation failed; see the compiler error output for details.
/home/jyj-lsy/workspace/XDroidMvp/mvp/src/main/java/cn/droidlover/xdroidmvp/net/XApi.java
Error:(103, 17) error: cannot find symbol class LogInterceptor
Error:(103, 53) error: cannot find symbol class LogInterceptor

针对MVP

这个MVP里的Model具体是实现什么的呢?我之前的了解model是处理网络请求、缓存的,但是这个里的model好像不太一样,能给一个关于MVP的整体的简单demo么?

adapter更新数据的小bug

XListAdapter里面有个小bug,
public void setData(T[] data) {
if (data != null && data.length > 0) {
setData(Arrays.asList(data));
}
}
这个方法里面,假设你有一个列表,允许用户删除元素,当删除完最后一个时,列表不会更新,并且,如果事件处理的位置没有非空判断的话,很可能还会空指针或者index越界.

使用XLazyFragment遇到异常

异常如下:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.fragment.app.FragmentManagerImpl.isDestroyed()' on a null object reference
注释掉如下代码:
try { Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); childFragmentManager.setAccessible(true); childFragmentManager.set(this, null); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); }

XDroidConf中的Router动画修改

您好
请问在XDroidConf中如何修改转场动画,我自己写了动画文件在主工程,但是在XDroidConf中不知道该怎么修改。

M呢?

大哥,既然是MVP,为嘛我只看到了V和P,M是哪个?如果我有一些操作需要访问数据库或网络,应该在哪做?望指教,谢谢

小bug

你好,base包下的XFragmentAdapter类中这个函数,应该用&&而不是||,对吧?
@OverRide
public CharSequence getPageTitle(int position) {
if (titles != null || titles.length > position) {
return titles[position];
}
return "";
}

1.9.5以上的版本依赖会出现问题

从2.0版开始依赖后会出现okhttp找不着的问题,还有下面这个
错误: 无法访问RxAppCompatActivity
public class MainActivity extends XActivity {
^
找不到com.trello.rxlifecycle2.components.support.RxAppCompatActivity的类文件

java.lang.NullPointerException: You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed).

java.lang.NullPointerException: You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed).
at com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:31)
at com.bumptech.glide.Glide.getRetriever(Glide.java:684)
at com.bumptech.glide.Glide.with(Glide.java:716)
at cn.droidlover.xdroidmvp.imageloader.GlideLoader.loadCircleImage(GlideLoader.java:161)
at com.yzf.king.adapter.BankCardAdapter.onBindViewHolder(BankCardAdapter.java:95)
at com.yzf.king.adapter.BankCardAdapter.onBindViewHolder(BankCardAdapter.java:37)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
at com.yanzhenjie.recyclerview.swipe.SwipeAdapterWrapper.onBindViewHolder(SwipeAdapterWrapper.java:182)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194)
at android.view.View.layout(View.java:20777)
at android.view.ViewGroup.layout(ViewGroup.java:6228)
at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:625)
at android.view.View.layout(View.java:20777)
at android.view.ViewGroup.layout(ViewGroup.java:6228)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083)
at android.view.View.layout(View.java:20777)
at android.view.ViewGroup.layout(ViewGroup.java:6228)
at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1855)
at android.view.View.layout(View.java:20777)
at android.view.ViewGroup.layout(ViewGroup.java:6228)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20777)
at android.view.ViewGroup.layout(ViewGroup.java:6228)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
at android.view.View.layout(View.java:20777)
at android.view.ViewGroup.layout(ViewGroup.java:6228)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20777)
at android.view.ViewGroup.layout(ViewGroup.java:6228)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
at android.view.View.layout(View.java:20777)
at android.view.ViewGroup.layout(ViewGroup.java:6228)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:1238)
at android.view.View.layout(View.java:20777)
at android.view.ViewGroup.layout(ViewGroup.java:6228)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2880)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2403)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1521)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7380)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1019)
at android.view.Choreographer.doCallbacks(Choreographer.java:831)
at android.view.Choreographer.doFrame(Choreographer.java:763)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1005)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:6922)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:868)

无法访问RxAppCompatActivity

错误: 无法访问RxAppCompatActivity
找不到com.trello.rxlifecycle2.components.support.RxAppCompatActivity的类文件

混淆

请问有具体的混淆代码吗

DiskCache put时一直过期BUG

问题出在正则表达式上
static String REGEX = "=====createTime\{(\d{1,})\}expireMills\{(\d{1,})\}";
改为可以解决
static String REGEX = "=====createTime\{(\d{1,})\}expireMills\{(-?\d{1,})\}";

原因在 NO_CACHE = -1L;是负数。前面的正则不能匹配负数。

XLog的BUG

我使用retrofit的时候在 HttpLoggingInterceptor的 log方法中使用XLog.d(TAG, message);进行打印 结果的我请求中有 3Uku3kyfA2QrkVUY%3D的内容,然后就报错了: java.util.MissingFormatArgumentException: Format specifier: 3D

导入module时出现了警告,mvp这个模块没有被当做库编译

刚刚按照readme里面的步骤将mvp模块导入了,并且添加了依赖,但是在build的时候出现了如下警告:

Warning:Unable to find module with Gradle path ':mvp' (needed by module 'app'.)
Linking to library 'mvp-unspecified' instead.

现在mvp模块还没有办法使用,请问如何操作?谢谢!

导入后包冲突报错

报错信息:Warning:Conflict with dependency 'com.google.code.findbugs:jsr305'. Resolved versions for app (3.0.1) and test app (2.0.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.

网上解决方案:
添加 configurations.all {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
}

能有其他办法吗?

DiskCache 丢失

重启app会丢失部分缓存。

找到问题是journal 文件写入不及时。

解决方案:在DiskLruCache 类的 completeEdit 函数最后加上 journalWriter.flush();

0ab6f3e3-4faa-4963-b30f-a58faae640f0

StateView不会消失

应该是算Bug,还是算没有完善呢... 无意中发现的
网络断开后,显示StateView,但是网络重连接后,StateView再也消失不了。
而且点击事件是可以穿透到下层界面的。

嘻嘻!框架还是不错滴,继续学习中... 加油!

华为P9上使用报错

java.lang.NullPointerException: Attempt to invoke interface method 'void android.support.v7.widget.DecorContentParent.setWindowCallback(android.view.Window$Callback)' on a null object reference
at cn.droidlover.xdroidmvp.mvp.XActivity.onCreate(XActivity.java:38)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.