Log
2020-03-10 12:40:18.455 4240-4240/? E/obu.taobaounio: Unknown bits set in runtime_flags: 0x8000
2020-03-10 12:40:18.904 4240-4240/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xiaobu.taobaounion, PID: 4240
java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.runtime/javalib/core-oj.jar)
at okhttp3.internal.Util.<clinit>(Util.java:87)
at okhttp3.internal.Util.skipLeadingAsciiWhitespace(Util.java:321)
at okhttp3.HttpUrl$Builder.parse(HttpUrl.java:1313)
at okhttp3.HttpUrl.get(HttpUrl.java:917)
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:492)
at com.xiaobu.taobaounion.utils.RetrofitManager.<init>(RetrofitManager.java:16)
at com.xiaobu.taobaounion.utils.RetrofitManager.<clinit>(RetrofitManager.java:7)
at com.xiaobu.taobaounion.utils.RetrofitManager.getRetrofitInstance(RetrofitManager.java:11)
at com.xiaobu.taobaounion.presenter.impl.HomePresenterImpl.getCategories(HomePresenterImpl.java:20)
at com.xiaobu.taobaounion.ui.fragment.HomeFragment.loadData(HomeFragment.java:28)
at com.xiaobu.taobaounion.base.BaseFragment.onCreateView(BaseFragment.java:20)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2663)
at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1425)
at android.app.Activity.performStart(Activity.java:7825)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
代码
model文件夹
Categories
package com.xiaobu.taobaounion.model.domain;
import java.util.List;
public class Categories {
/**
* success : true
* code : 10000
* message : 获取分类成功.
* data : [{"id":9660,"title":"推荐"},{"id":9649,"title":"食品"}]
*/
private boolean success;
private int code;
private String message;
private List<DataBean> data;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
@Override
public String toString() {
return "DataBean{" +
"id=" + id +
", title='" + title + '\'' +
'}';
}
/**
* id : 9660
* title : 推荐
*/
private int id;
private String title;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
@Override
public String toString() {
return "Categories{" +
"success=" + success +
", code=" + code +
", message='" + message + '\'' +
", data=" + data +
'}';
}
}
Api
package com.xiaobu.taobaounion.model;
import com.xiaobu.taobaounion.model.domain.Categories;
import retrofit2.Call;
import retrofit2.http.GET;
public interface Api {
@GET("discovery/categories")
Call<Categories> getCategories() ;
}
view文件夹
IHomeCallback
package com.xiaobu.taobaounion.view;
import com.xiaobu.taobaounion.model.domain.Categories;
public interface IHomeCallback {
void onCategoriesLoaded(Categories categories);
}
presenter文件夹
HomePresenterImpl
package com.xiaobu.taobaounion.presenter.impl;
import com.xiaobu.taobaounion.model.Api;
import com.xiaobu.taobaounion.model.domain.Categories;
import com.xiaobu.taobaounion.presenter.IHomePresenter;
import com.xiaobu.taobaounion.utils.LogUtil;
import com.xiaobu.taobaounion.utils.RetrofitManager;
import com.xiaobu.taobaounion.view.IHomeCallback;
import java.net.HttpURLConnection;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class HomePresenterImpl implements IHomePresenter {
@Override
public void getCategories() {
Retrofit retrofit = RetrofitManager.getRetrofitInstance().getRetrofit();
Api api = retrofit.create(Api.class);
final Call<Categories> task = api.getCategories();
task.enqueue(new Callback<Categories>() {
@Override
public void onResponse(Call<Categories> call, Response<Categories> response) {
LogUtil.d(HomePresenterImpl.this,"response.code--->"+response.code());
if (response.code() == HttpURLConnection.HTTP_OK){
Categories categories = response.body();
LogUtil.i(HomePresenterImpl.this,"body---->"+categories.toString());
}
}
@Override
public void onFailure(Call<Categories> call, Throwable t) {
}
});
}
//注册UI通知接口
@Override
public void registerCallback(IHomeCallback callback) {
}
//取消UI通知接口
@Override
public void unregisterCallback(IHomeCallback callback) {
}
}
IHomePresenter
package com.xiaobu.taobaounion.presenter;
import com.xiaobu.taobaounion.view.IHomeCallback;
public interface IHomePresenter {
/**
* 获取商品分类
*/
void getCategories();
void registerCallback(IHomeCallback callback);
void unregisterCallback(IHomeCallback callback);
}
base文件夹
BaseFrement
package com.xiaobu.taobaounion.base;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public abstract class BaseFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
int resId = getRootViewResId();
View rootView = inflater.inflate(resId, container, false);
initPresenter();
loadData();
return rootView;
}
@Override
public void onDestroyView() {
super.onDestroyView();
release();
}
protected void release() {
//释放资源
}
protected void initPresenter() {
//创建presenter
}
protected void loadData() {
//加载数据
}
protected abstract int getRootViewResId();
}
fragment文件夹
HomeFragment
package com.xiaobu.taobaounion.ui.fragment;
import com.xiaobu.taobaounion.R;
import com.xiaobu.taobaounion.base.BaseFragment;
import com.xiaobu.taobaounion.model.domain.Categories;
import com.xiaobu.taobaounion.presenter.impl.HomePresenterImpl;
import com.xiaobu.taobaounion.view.IHomeCallback;
public class HomeFragment extends BaseFragment implements IHomeCallback {
private HomePresenterImpl mHomePresenter;
@Override
protected int getRootViewResId() {
return R.layout.fragment_home;
}
@Override
protected void initPresenter() {
//创建presenter
mHomePresenter = new HomePresenterImpl();
mHomePresenter.registerCallback(this);
}
@Override
protected void loadData() {
//加载数据
mHomePresenter.getCategories();
}
@Override
protected void release() {
//取消回调注册
if (mHomePresenter != null) {
mHomePresenter.unregisterCallback(this);
}
}
@Override
public void onCategoriesLoaded(Categories categories) {
}
}
utils文件夹
BaseUrlConstant
package com.xiaobu.taobaounion.utils;
public class BaseUrlConstant {
public static final String BASE_URL = "https://api.sunofbeach.net/shop/api";
}
RetrofitManager
package com.xiaobu.taobaounion.utils;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitManager {
private static final RetrofitManager ourInstance = new RetrofitManager();
private final Retrofit mRetrofit;
public static RetrofitManager getRetrofitInstance() {
return ourInstance;
}
private RetrofitManager() {
mRetrofit = new Retrofit.Builder()
.baseUrl(BaseUrlConstant.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
public Retrofit getRetrofit(){
return mRetrofit;
}
}
LogUtil
package com.xiaobu.taobaounion.utils;
import android.util.Log;
public class LogUtil {
private static int currentLever = 4;
private static final int DEBUG_LEVER = 4;
private static final int INFO_LEVER = 3;
private static final int WARNING_LEVER = 2;
private static final int ERROR_LEVER = 1;
public static void d(Object object, String log) {
if (currentLever >= DEBUG_LEVER) {
Log.d(object.getClass().getSimpleName(), log);
}
}
public static void i(Object object, String log) {
if (currentLever >= INFO_LEVER) {
Log.i(object.getClass().getSimpleName(), log);
}
}
public static void w(Object object, String log) {
if (currentLever >= WARNING_LEVER) {
Log.w(object.getClass().getSimpleName(), log);
}
}
public static void e(Object object, String log) {
if (currentLever >= ERROR_LEVER) {
Log.e(object.getClass().getSimpleName(), log);
}
}
}
您的每一个用心回答,都会让这个世界变得更美好一些!