依赖
//Butterknfie
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
//
implementation "com.squareup.okhttp3:okhttp:3.12.0"
implementation 'com.squareup.okhttp3:okhttp:3.7.0'
implementation 'com.squareup.okio:okio:1.12.0'
//
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
//
implementation 'com.github.bumptech.glide:glide:4.8.0'
//Gson解析
implementation 'com.google.code.gson:gson:2.8.1'
//banner
implementation 'com.github.pinguo-zhouwei:MZBannerView:v2.0.2'
//导入Design包
implementation 'com.android.support:design:28.+'
//SmartRefreshLayout
implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-19'
implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0-alpha-19'
//RecyclerView适配器
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
okHttp 封装
public class OkHttpUtils<T> {
private final OkHttpClient okHttpClient;
private OkHttpUtils(){
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new LogInterceptor())
.connectTimeout(5,TimeUnit.SECONDS)
.readTimeout(5,TimeUnit.SECONDS)
.build();
}
public static OkHttpUtils getHttpUtilsInstance(){
return HttpUtilsInstance.okHttpUtils;
}
private static class HttpUtilsInstance{
public static OkHttpUtils okHttpUtils = new OkHttpUtils();
}
//get
public void getData(String path, final Class<T> aClass){
final Request request = new Request.Builder().url(path).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
backData.onFail(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
Gson gson = new Gson();
T t = gson.fromJson(string, aClass);
Message message = handler.obtainMessage();
message.obj = t;
handler.sendMessage(message);
}
});
}
//post
public void postData(String path, HashMap<String,String> hashMap, final Class<T> aClass){
FormBody.Builder builder = new FormBody.Builder();
for (String key : hashMap.keySet()) {
builder.add(key,hashMap.get(key));
}
FormBody formBody = builder.build();
Request request = new Request.Builder()
.url(path)
.post(formBody)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
backData.onFail(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
Gson gson = new Gson();
T t = gson.fromJson(string, aClass);
Message message = handler.obtainMessage();
message.obj = t;
handler.sendMessage(message);
}
});
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
T t = (T) msg.obj;
backData.onResponse(t);
}
};
CallBackData backData;
public void setCallBackData(CallBackData backData){
this.backData = backData;
}
//接口回调
public interface CallBackData<D>{
void onResponse(D d);
void onFail(String massage);
}
}
拦截器log
public class LogInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//打印所需信息
logPrint(request);
Response response = chain.proceed(request);
//打印所需信息
logPrint(request);
return response;
}
private void logPrint(Request request) {
Log.e("LogInterceptor", "request:" + request);
Log.e("LogInterceptor", "System.nanoTime():" + System.nanoTime());
Log.e("LogInterceptor", request.method());
}
}
pppp层
//base
public class BasePresenter<V extends IBaseView> {
private V mView;
public void setView(V v){
this.mView = v;
}
public void detachData(){
this.mView = null;
}
public V getView(){
return mView;
}
}
//
public class ShopPresenter extends BasePresenter<IShopView> {
private final OkHttpUtils okHttpUtils;
public ShopPresenter(){
//获取M层
okHttpUtils = OkHttpUtils.getInstance();
okHttpUtils.setCallBackData(new OkHttpUtils.CallBackData<NewsBean>() {
@Override
public void onFailure(String message) {
getView().onFild(message);
}
@Override
public void onResponse(NewsBean bean) {
getView().onSuccess(bean);
}
});
}
public void getMianData(String loginUrl, Class<NewsBean> loginBeanClass) {
okHttpUtils.getData(loginUrl,loginBeanClass);
}
}
//vvv层
// IView
public interface IMainView extends IBaseView {
void onSuccess(LoginBean bean);
void onFild(String message);
}
//登录
public class MainActivity extends AppCompatActivity implements IMainView {
@BindView(R.id.login_phone)
EditText loginPhone;
@BindView(R.id.login_pwd)
EditText loginPwd;
@BindView(R.id.login_dl)
Button loginDl;
@BindView(R.id.login_zc)
Button loginZc;
private MainPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initData();
}
public void initData() {
//获取P层
presenter = new MainPresenter();
//关联
presenter.setView(this);
}
@Override
public void onSuccess(LoginBean bean) {
String message = bean.getMessage();
String status = bean.getStatus();
if(status.equals("0000")){
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this, ShowActivity.class);
startActivity(intent);
}
}
@Override
public void onFild(final String message) {
Log.e("onFild", Thread.currentThread().getName());
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e("onFild", message);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.detachData();
}
@OnClick({R.id.login_dl, R.id.login_zc})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.login_dl:
String phone = loginPhone.getText().toString();
String pwd = loginPwd.getText().toString();
if(phone.equals("")||pwd.equals("")){
Toast.makeText(this, "账号或密码不可为空", Toast.LENGTH_SHORT).show();
return;
}
presenter.getMianData(UrlBean.LOGIN_URL,phone,pwd,LoginBean.class);
break;
case R.id.login_zc:
Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
startActivity(intent);
break;
}
}
}
//展示
public class ShowActivity extends AppCompatActivity implements IShopView {
@BindView(R.id.recyclerView)
RecyclerView recyclerView;
private ShopPresenter presenter;
private Context context;
private NewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show);
ButterKnife.bind(this);
context = this;
initData();
}
private void initData() {
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
adapter = new NewAdapter(context);
recyclerView.setAdapter(adapter);
//
presenter = new ShopPresenter();
presenter.setView(this);
presenter.getMianData(UrlBean.PATH,NewsBean.class);
}
@Override
public void onSuccess(NewsBean bean) {
List<NewsBean.DataBean> data = bean.getData();
adapter.initData(data);
adapter.notifyDataSetChanged();
}
@Override
public void onFild(final String message) {
Log.e("ShowonFild", Thread.currentThread().getName());
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e("ShowonFild", message);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.detachData();
}
}
//属性动画
switch (view.getId()) {
case R.id.py:
//平移
AnimatorSet set1 = new AnimatorSet();
ObjectAnimator translationX = ObjectAnimator.ofFloat(kaoimage, "translationX", 0, 600);
ObjectAnimator translationY = ObjectAnimator.ofFloat(kaoimage, "translationY", 0, 900);
//translationX.start();
set1.play(translationX).with(translationY);
set1.setDuration(3000);
set1.start();
break;
case R.id.jb:
//渐变
ObjectAnimator alpha = ObjectAnimator.ofFloat(kaoimage, "alpha", 1, 0,1);
alpha.setDuration(3000);
alpha.start();
break;
case R.id.xz:
//旋转
ObjectAnimator rotation = ObjectAnimator.ofFloat(kaoimage, "rotation", 360, 0);
rotation.setDuration(3000);
rotation.start();
break;
case R.id.sf:
//缩放 变大变小
AnimatorSet set2 = new AnimatorSet();
ObjectAnimator scaleX = ObjectAnimator.ofFloat(kaoimage, "scaleX", 1, 3,1);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(kaoimage, "scaleY", 1,3, 1);
set2.play(scaleX).with(scaleY);
set2.setDuration(3000);
set2.start();
break;
//简单全局捕获异常
在App类中写
public class App extends Application implements Thread.UncaughtExceptionHandler{
@Override
public void onCreate() {
super.onCreate();
//进行异常捕获
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
//进行日志打印
Writer writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
throwable.printStackTrace(printWriter);
Toast.makeText(this,"凉了",Toast.LENGTH_LONG).show();
}
}