如何使用(或替换)Java 8 功能接口与 Android API 低于 24?

问题描述 投票:0回答:2

我正在开发一个安卓应用程序(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)

我该如何解决这个问题?

android java-8 method-reference functional-interface
2个回答
0
投票

在您的应用程序级别

build.gradle
文件中,您可以像这样指定
compileOptions
块以使用Java-8功能:

android {
  ...

  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

0
投票

如果您使用的是 Android Studio,只需转到

File -> Project Structure -> app
和 将
Source Compatibility
更改为
1.8
Target Compatibility
也更改为
1.8
如下图所示:

© www.soinside.com 2019 - 2024. All rights reserved.