android 4.4 connection 报错,让你Android开发更简单

搭建一个新的Android项目,你会怎么做?

每个人对应用框架的理解不相同,但是最终达到的效果应该是一样:

①降低项目的复杂性

②易扩展、易修改、可重用性强、可维护性强

③职责单一,功能清晰

在android开发项目中,我们首先要考虑每个项目的共同点,比如说:Mvp、网络请求层、Base存放View的基类、Log日志、App crash、刷新加载更多、Loading、广告图、支持ListView,RecyclerView的BaseAdater、通知栏沉浸式、图片加载缓存、底部导航功能...

那么这些功能是每个项目都必须需要的功能,那么可不可以以把这些通用的东西抽取呢?

项目工程搭建

ebf2bad43fff9da7f1deca2321ec32e0.png

App工程包结构.png

包名的作用一目了然,在别人接手这个项目的时候就会相对简单

adapter 适配器,如果业务复杂,根据不同的业务可以添加子包来进行分类

api 网络请求层的封装 retrofit &okhttp3 &rxjava

base 用来存放View的基类,例如BaseAcitivity、BaseFragment、BaseSwipeBackActivity、BasePresent

manage 用来存放一些通用的管理类: Crash、ImageLoader、Logger

model 封装Mvp Logic池,通过注解的方式contact和presenter进行实例化和bindView,使用时直接使用mPresenter

ui 自定义View 滑动删除,底部导航

common libraries 开源库的选型

LeakCanary: LeakCanarySquare出品的专门用来检测Android和Java的内存泄漏

//squareup

compile ‘com.squareup.retrofit2:retrofit:2.1.0‘

compile ‘com.squareup.retrofit2:converter-gson:2.1.0‘

compile ‘com.squareup.retrofit2:adapter-rxjava:2.1.0‘

compile ‘com.squareup.okhttp3:logging-interceptor:3.4.1‘

compile ‘com.jakewharton:butterknife:7.0.1‘

compile ‘com.github.bumptech.glide:glide:3.7.0‘

compile ‘io.reactivex:rxjava:1.1.5‘

compile ‘io.reactivex:rxandroid:1.2.0‘

compile ‘com.jcodecraeer:xrecyclerview:1.2.7‘

项目新建重构

对Android一些常用功能做一些整理封装成basic框架,方便Android初始项目快速开发

https://github.com/meikoz/Basic

仿开眼Demo示例:Basic+Retrofit+Okhttp+Rxjava+Glide

请大家多多关注star和提意见给予支持,从自己的一些实践经验来总结这部分通用的东西作为一份善意的分享。

How Usage

Step 1:

Setup ‘Basic‘ dependencies in build.gradle file:

dependencies {

compile ‘com.meikoz.basic:core:1.0.5‘

}

Step 2:

Create subclass of Application extends MainApplication,initialize basic BuildConfig.debug is true in super.onCreate() method before for debug print log.

public class BaseApp extends MainApplication {

@Override

public void onCreate() {

RestApi.getInstance().deBug(true);

super.onCreate();

}

}

RestApi.getInstance().deBug(true); 是为了Debug打印日志,请上线前删掉此方法#重要#

Step 3:

app usage mvp pattern, View and Presenter need things.

View extends BaseView. Presenter extends BasePresenter.

@Implement(MainLogicImpl.class)

public interface MainLogicI {

void onLoadData2Remote();

interface MainView extends BaseView {

void onLoadSuccessHandler(String responce);

}

}

public class MainLogicImpl extends BasePresenter

implements MainLogicI {

@Override

public void onLoadData2Remote() {

getView().onLoadSuccessHandler("请求成功,返回的数据");

}

}

How to initialize use the Activity.

class MainActivity extends Activity implements MainLogicI.MainView {

@Override

protected Class getLogicClazz() {

return your interface MainLogicI class;// MainLogic是Presenter要实现的接口

}

@Override

protected void onInitData2Remote() {

super.onInitData2Remote();

((MainLogicImpl) mPresenter).onLoadData2Remote();

}

@Override

public void onLoadSuccessHandler(String response) {

//response是Presenter中返回的数据

}

}

super.onInitData2Remote(); 会初始化Presnter并bindView

Step 4:

Network: Retrofit + okhttp

根据不同业务生成不同Service

public class ApiManager {

public static APIService createApi() {

return RestApi.getInstance().create(APIService.class);

}

public static UserService createUserApi() {

return RestApi.getInstance().create(UserService.class);

}

}

public interface APIService {

String BASE_URL ="https://github.com/";

@GET("api/v1/user")

Call getUserInfo(@Query("uid") int uid);

}

cool feature

feature 1:实现 Tab +fragment 功能

105ab6907133d210c15f88c45d5ce170.png

QQ图片20161121164914.png

public class MainAty extends AppCompatActivity {

private TabStripView navigateTabBar;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

navigateTabBar = (TabStripView) findViewById(R.id.navigateTabBar);

navigateTabBar.onRestoreInstanceState(savedInstanceState);

navigateTabBar.addTab(HomeFragment.class,

new TabStripView.TabParam(R.drawable.ic_tab_strip_icon_feed,

R.drawable.ic_tab_strip_icon_feed_selected,

R.string.tab_bar_text_feed));

navigateTabBar.addTab(DiscoveryFragment.class,

new TabStripView.TabParam(R.drawable.ic_tab_strip_icon_category,

R.drawable.ic_tab_strip_icon_category_selected,

R.string.tab_bar_text_category));

navigateTabBar.addTab(AutoFragment.class,

new TabStripView.TabParam(R.drawable.ic_tab_strip_icon_pgc,

R.drawable.ic_tab_strip_icon_pgc_selected,

R.string.tab_bar_text_pgc));

navigateTabBar.addTab(ProfileFragment.class,

new TabStripView.TabParam(R.drawable.ic_tab_strip_icon_profile,

R.drawable.ic_tab_strip_icon_profile_selected,

R.string.tab_bar_text_profile));

}

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

navigateTabBar.onSaveInstanceState(outState);

}

}

feature 2:实现仿ios弹窗效果

dfa6d61758f820111d263de4505a46ba.png

默认取消确定按钮.png

setCancelable(true) 默认显示取消按钮,用法和原生AlertDialog写法一样

new SweetAlertDialog.Builder(MainActivity.this)

.setTitle("标题")

.setMessage("描述详细内容?")

.setCancelable(true)

.setPositiveButton("确认", new SweetAlertDialog.OnDialogClickListener() {

@Override

public void onClick(Dialog dialog, int which) {

Toast.makeText(MainActivity.this, "确定按钮", Toast.LENGTH_SHORT).show();

}

})

.show();

1545f660ff43715f94a84cd9cdddbc5c.png

只有一个确定按钮.png

![Uploading QQ图片20161121171109_005140.png . . .]

setCancelable(false) 这样就只显示一个按钮

new SweetAlertDialog.Builder(MainActivity.this)

.setTitle("标题")

.setMessage("描述详细内容?")

.setCancelable(false)

.setPositiveButton("确认", new SweetAlertDialog.OnDialogClickListener() {

@Override

public void onClick(Dialog dialog, int which) {

Toast.makeText(MainActivity.this, "确定按钮", Toast.LENGTH_SHORT).show();

}

})

.show();

faac0211f684e318165d907d21e2c98f.png

左右边都设置按钮.png

左右按钮自定义

new SweetAlertDialog.Builder(MainActivity.this)

.setTitle("标题")

.setMessage("描述详细内容?")

.setCancelable(false)

.setNegativeButton("左边", new SweetAlertDialog.OnDialogClickListener() {

@Override

public void onClick(Dialog dialog, int which) {

Toast.makeText(MainActivity.this, "左边" + which, Toast.LENGTH_SHORT).show();

}})

.setPositiveButton("确认", new SweetAlertDialog.OnDialogClickListener() {

@Override

public void onClick(Dialog dialog, int which) {

Toast.makeText(MainActivity.this, "确定按钮", Toast.LENGTH_SHORT).show();

}

})

.show();

feature 3:CommonAdapter for ListView, RecyclerAdapter for RecyclerView

CommonAdapter for ListView, RecyclerAdapter for RecyclerView

实现 void convert(ViewHolder helper, T item); Replace getView();

feature 4:Logger 漂亮的日志系统

Logger.d(message);

Logger.i(message);

Logger.e(message);

Logger.v(message);

Logger.json(message);

33c7f4d4853f1b1d39dc4d5a1419929a.png

漂亮的日志.png

To do something v2.0.0

网络请求前增加LoadingView,加完完成消失

加载失败统一失败页面,支持重新请求

Activity销毁掉,关闭网络请求功能 避免报错

EyepetizerApp: 使用Basic框架完成开眼App

原文:http://www.cnblogs.com/benchao/p/6100834.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值