【问题标题】:Currency Converter App crashes by pressing the Convert-Button (with API)按转换按钮(使用 API)时,货币转换器应用程序崩溃
【发布时间】:2021-03-14 13:14:02
【问题描述】:

我正在尝试为我的学校项目制作一个带有 api 的货币转换器。转换器编码为Fragment。每次我尝试按Button 转换一对时,应用程序都会崩溃。这是我得到的错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.LulusApp, PID: 1675
    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.art/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.example.LulusApp.Retrofit.RetrofitBuilder.getRetrofitInstance(RetrofitBuilder.java:11)
        at com.example.LulusApp.CurrencyConverterFragment$1.onClick(CurrencyConverterFragment.java:53)
        at android.view.View.performClick(View.java:7448)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
I/Process: Sending signal. PID: 1675 SIG: 9

这是我的CurrencyConverterFragment.java,一切都已连接:

public class CurrencyConverterFragment extends Fragment {


    public CurrencyConverterFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_currency_converter, container, false);

        final EditText currencyAmount = (EditText) view.findViewById(R.id.currency_amount);
        final EditText currencyResult = (EditText) view.findViewById(R.id.currency_result);
        final Spinner currencyFromDropdown = (Spinner) view.findViewById(R.id.currency_from);
        final Spinner currencyToDropdown = (Spinner) view.findViewById(R.id.currency_to);
        Button buttonResult = (Button) view.findViewById(R.id.button_result);

        //Adding Functionality
        String[] dropDownList = {"USD", "EUR","CHF"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),R.layout.support_simple_spinner_dropdown_item,dropDownList);
        currencyFromDropdown.setAdapter(adapter);
        currencyToDropdown.setAdapter(adapter);

        buttonResult.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//Below is error line 53
                RetrofitInterface retrofitInterface = RetrofitBuilder.getRetrofitInstance().create(RetrofitInterface.class);
                Call<JsonObject> call = retrofitInterface.getExchangeCurrency(currencyFromDropdown.getSelectedItem().toString());
                call.enqueue(new Callback<JsonObject>() {
                    @Override
                    public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
                        Log.d("response",String.valueOf(response.body()));
                        JsonObject res = response.body();
                        JsonObject conversion_rates = res.getAsJsonObject("conversion_rates");
                        double amount = Double.parseDouble(currencyAmount.getText().toString());
                        double multiplier = Double.parseDouble(conversion_rates.get(currencyToDropdown.getSelectedItem().toString()).toString());
                        double result = amount * multiplier;
                        currencyResult.setText(String.valueOf(result));
                    }

                    @Override
                    public void onFailure(Call<JsonObject> call, Throwable t) {

                    }
                });
            }
        });




        return view;
    }
}

这是.xml layout 文件,其中包含2 个Spinner、2 个EditText、一些TextViewButton

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".CurrencyConverterFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/Converter_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Currency Converter"
            android:textSize="36dp"
            android:textAppearance="@style/TextAppearance.AppCompat.Medium"
            android:textColor="?attr/colorPrimary"
            android:layout_margin="20dp"
            android:layout_gravity="center"/>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_gravity="center">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Amount to be converted"
            android:textSize="16dp"
            android:textAppearance="@style/TextAppearance.AppCompat.Medium"
            android:textColor="?attr/colorPrimary"
            android:layout_margin="20dp"/>

        <EditText
            android:id="@+id/currency_amount"
            android:layout_width="250dp"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:textColor="?attr/colorPrimary"
            android:layout_marginBottom="20dp"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="From Currency:"
            android:textSize="16dp"
            android:textAppearance="@style/TextAppearance.AppCompat.Medium"
            android:textColor="?attr/colorPrimary"
            android:layout_margin="20dp"/>

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/border_spinner_currency_converter"
                android:layout_marginBottom="20dp"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp">
                <Spinner
                    android:layout_width="250dp"
                    android:layout_height="40dp"
                    android:id="@+id/currency_from"
                    android:layout_gravity="center"/>
            </RelativeLayout>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="To Currency:"
            android:textSize="16dp"
            android:textAppearance="@style/TextAppearance.AppCompat.Medium"
            android:textColor="?attr/colorPrimary"
            android:layout_margin="20dp"/>

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/border_spinner_currency_converter"
                android:layout_marginBottom="20dp"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp">
                <Spinner
                    android:layout_width="250dp"
                    android:layout_height="40dp"
                    android:id="@+id/currency_to"
                    android:layout_gravity="center"/>
            </RelativeLayout>
        </LinearLayout>
        <Button
            android:id="@+id/button_result"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:layout_gravity="center"
            android:text="Convert"
            android:textColor="#FFFFFF"
            android:background="@drawable/custom_button_currency_converter"/>

        <EditText
            android:id="@+id/currency_result"
            android:layout_width="250dp"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:layout_marginBottom="20dp"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:hint="Result"/>

    </LinearLayout>
</ScrollView>

我使用的 api 的 RetrofitBuilder.java

public class RetrofitBuilder {
    private static Retrofit retrofit;
    public static Retrofit getRetrofitInstance(){
        if(retrofit == null){
            retrofit = new Retrofit.Builder()
//Below is error line 11:
                    .baseUrl("https://v6.exchangerate-api.com/v6/9b7aaded7a6b901a07526894/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

最后interface@GET 的特定货币是@Path

public interface RetrofitInterface {
    @GET("latest/{currency}")
    Call<JsonObject> getExchangeCurrency(@Path("currency")String currency);
}

【问题讨论】:

  • 您得到的实际错误是什么?哪个是第 53 行??
  • 在你的“get”调用之后,检查你是否真的得到了一些东西。
  • 错误日志跟踪不完整,没有人能够从中推断出任何东西。请张贴整个日志。
  • @MrR 我在代码中用 cmets 标记了它,对不起。我错过了。希望对您有所帮助。
  • @iCantC 我用整个日志编辑了错误。感谢您的帮助!

标签: java android api android-studio button


【解决方案1】:

改造类不是&不能是静态的。如果类是静态的,则不能包含任何非静态成员。这就是运行时错误指出没有这样的静态方法的原因。在 onCreate 方法中获取 Retrofit 实例,或者为 RetrofitBuilder 类创建一个构造方法,以 Context 为参数。然后建立界面并在那里执行.create(RetrofitInterface.class);,而不是在外面。在类中也添加一个 get() 方法,用于检索 Retrofit 实例,并在需要时从外部调用类似 new RetrofitBuilder(getApplicationContext()) 的类。

【讨论】:

  • 我希望我能做到。你能在我的代码中实现你的解决方案吗?就像我需要添加的 sn-ps 一样。我对此真的很陌生。谢谢亲爱的!
猜你喜欢
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2022-11-17
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多