我正在开发一个安卓应用程序(minSdkVersion:23)。 在我的登录方法中,我这样调用:
RequestClass.doRequestWithApi(this.getApplicationContext(), this.TAG, dataToPass, this::getMyAccount);
这是 doRequestWithApi 方法:
public static void doRequestWithApi(Context c, final String TAG, final Map<String, String> paramsToPass, final Function<JSONObject,Boolean> f){
String urlData = "http://...";
//For localhost
//String urlData = "http://10.0.2.2/...";
Log.i(CAT,paramsToPass.toString());
URL url = null;
try {
url = new URL(urlData);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();
Log.i(CAT, "Start Building");
StringRequest jsObjRequest = new StringRequest(Request.Method.POST, url.toString(),
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i(CAT, "Reponse : " + response.toString() );
try {
f.apply(new JSONObject(response));
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i(TAG, error.toString());
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> map = new HashMap<String, String>();
map.put("Accept-Language", Locale.getDefault().toString());
return map;
}
@Override
protected Map<String, String> getParams(){
return paramsToPass;
}
};
jsObjRequest.setRetryPolicy(new DefaultRetryPolicy(0, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
// Access the RequestQueue through your singleton class.
MySingletonRequestApi.getInstance(c).addToRequestQueue(jsObjRequest, TAG);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
如您所见,
this::getMyAccount
是函数式接口的使用,它是 java 8 的功能。
我找到了这个页面:Java 8 Android 支持 它表明 java.lang.FunctionalInterface 仅在 API 级别 24 或更高级别上受支持。 事实上,当我尝试在 6.0 android 设备(API 23)上运行我的应用程序时,它会抛出此错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: etsymbiose.defdress, PID: 8296
java.lang.NoClassDefFoundError: etsymbiose.defdress.LoginActivity$$Lambda$1
at etsymbiose.defdress.LoginActivity.onCreate(LoginActivity.java:51)
at android.app.Activity.performCreate(Activity.java:6301)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2519)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
我该如何解决这个问题?
在您的应用程序级别
build.gradle
文件中,您可以像这样指定compileOptions
块以使用Java-8功能:
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}