当前位置: 首页 > 知识库问答 >
问题:

通过在Android中进行改装,在使用实时货币转换API时出错

万俟招
2023-03-14

//这是我的主要活动。Java语言

ublic class MainActivity extends AppCompatActivity implements View.OnClickListener{

private static final String TAG = "MainActivity";
private TextView result;
private EditText currency;
private Button button;
private static String BASE_URL = "https://api.currencyscoop.com/v1/";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(TAG, "onCreate: called");
    initViews();
    button.setOnClickListener(this);
}

public void initViews(){
    Log.d(TAG, "initViews: called");
    result = findViewById(R.id.result);
    currency = findViewById(R.id.amount);
    button = findViewById(R.id.button);
}

@Override
public void onClick(View v) {
    Log.d(TAG, "onClick: called");
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    RetrofitClient retrofitClient = retrofit.create(RetrofitClient.class);
    Call<ConvertAmt> calling = retrofitClient.getConvertedValue("my_api_key","USD", "INR", currency.getText().toString());
    calling.enqueue(new Callback<ConvertAmt>() {
        @Override
        public void onResponse(Call<ConvertAmt> call, Response<ConvertAmt> response) {
            Log.d(TAG, "onResponse: called :----------------------> "+response.body().getResult());
        }

        @Override
        public void onFailure(Call<ConvertAmt> call, Throwable t) {
            Log.d(TAG, "onFailure: --------------> "+t.getStackTrace());
        }
    });
}

}

//这是我的客户端界面

public interface RetrofitClient {

@GET("/convert?")
Call<ConvertAmt> getConvertedValue(@Query("api_key") String api_key, @Query("base") String base, @Query("to") String to, @Query("amount") String amount);

}

//这是我的ConvertAmt类(存储结果的模型类)

公共类convertmat{private double result;

public ConvertAmt(double result) {
    this.result = result;
}

public double getResult() {
    return result;
}

public void setResult(double result) {
    this.result = result;
}

@Override
public String toString() {
    return "ConvertAmt{" +
            "result=" + result +
            '}';
}

}

//这是我的StackTrace

2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: java.io.EOFException: End of input at line 1 column 1 path $

2020-08-27 23:59:53.212 1471-1471/com。实例带系统的在线货币。错误:在com.google.格森。流动JsonReader。nextNonWhitespace(JsonReader.java:1401)2020-08-27 23:59:53.212 1471-1471/com。实例带系统的在线货币。错误:在com.google.格森。流动JsonReader。doPeek(JsonReader.java:549)2020-08-27 23:59:53.212 1471-1471/com。实例带系统的在线货币。错误:在com.google.格森。流动JsonReader。peek(JsonReader.java:425)2020-08-27 23:59:53.212 1471-1471/com。实例带系统的在线货币。错误:在com.google.格森。内部的绑定ReflectiveTypeAdapterFactory$Adapter。阅读(ReflectiveTypeAdapterFactory.java:205)2020-08-27 23:59:53.212 1471-1471/com。实例带系统的在线货币。错误:在改装2。转换器。格森。GsonResponseBodyConverter。convert(GsonResponseBodyConverter.java:39)2020-08-27 23:59:53.212 1471-1471/com。实例带系统的在线货币。错误:在改装2。转换器。格森。GsonResponseBodyConverter。convert(GsonResponseBodyConverter.java:27)2020-08-27 23:59:53.213 1471-1471/com。实例带系统的在线货币。错误:在改装2。OkHttpCall。parseResponse(OkHttpCall.java:223)2020-08-27 23:59:53.213 1471-1471/com。实例带系统的在线货币。错误:在改装2。Okhttp呼叫1美元。onResponse(OkHttpCall.java:121)2020-08-27 23:59:53.213 1471-1471/com。实例带系统的在线货币。错误:在okhttp3。RealCall$AsyncCall。执行(RealCall.java:206)2020-08-27 23:59:53.213 1471-1471/com。实例带系统的在线货币。错误:在okhttp3。内部的NamedRunnable。运行(NamedRunnable.java:32)2020-08-27 23:59:53.213 1471-1471/com。实例带系统的在线货币。错误:在java。util。同时发生的线程池执行器。runWorker(ThreadPoolExecutor.java:1133)2020-08-27 23:59:53.213 1471-1471/com。实例带系统的在线货币。错误:在java。util。同时发生的ThreadPoolExecutor$Worker。run(ThreadPoolExecutor.java:607)2020-08-27 23:59:53.213 1471-1471/com。实例带系统的在线货币。错误:在java。lang.Thread。运行(Thread.java:761)

共有1个答案

单于亮
2023-03-14

您期望从响应中获得的数据似乎与您正在映射的pojo不匹配这就是您期望的,

public class ConvertAmt { 
 private double result;
}

实际响应为

{
    "meta": {
        "code": 200,
        "disclaimer": "Usage subject to terms: https://currencyscoop.com/terms"
    },
    "response": {
        "timestamp": 1598589131,
        "date": "2020-08-27",
        "from": "USD",
        "to": "INR",
        "amount": "10",
        "value": 738.1371942
    }
}

所以你可以把你的pojo转换成

public class ConvertAmt { 
 private Map<String,Object> meta;
 private Map<String,Object> response;

}

你可以得到这样的回应

Call<ConvertAmt> calling = retrofitClient.getConvertedValue("my_api_key","USD", "INR", currency.getText().toString());


calling.getResponse().get("amount");
 类似资料:
  • 当我按下按钮时,应用程序会崩溃。每个转换“国名”功能都是一个按钮。我会在评论中发布错误。提前道谢。

  • 给定一美元金额,将其转换为欧元硬币和纸币。你得到了美元金额作为论据,并说美元对欧元的汇率是1.30。你可以看到欧元的名称是500美元,200美元,100美元,50美元,20美元,10美元,5美元,2美元,1美元,50美分,25美分,10美分,5美分,2美分,1美分。将该美元金额转换为最小金额的纸币和硬币。(将数字美元金额(如10.00美元)转换为等值的欧元纸币和硬币。) 免责声明:这是我收到的家庭

  • 我读过不同的Q 脚本: Raddo公司在英国、法国和美国设有3个分支机构。拉德多有基础货币美元。预算是以美元编制的。Raddo商店支持数据库中的库伦奇汇率。 英国员工以英镑创建采购订单,法国员工以欧元创建采购订单。 问题1:采购订单/订单项目数据库表中应存储哪些内容-分行所在地货币和当前汇率或以基础货币美元表示的换算金额?请记住,汇率必须是创建采购订单时的汇率。 问题2:转换什么以及何时能够生成美

  • 我正在兑换货币,遇到了一个奇怪的四舍五入问题。以下是缩写代码: 以下是这些值(所有值都在“快速监视”窗口中验证过): 是Double类型 是类型字符串 是可为空的十进制类型 中的值为: 中的值为: 为什么在语句中四舍五入到1.37,而不是在下面完全相同的计算中四舍五入?我甚至把货币支票复制到第二个任务中,以确保这不会影响事情。如果想要精确,是否必须在语句之外进行计算?

  • 本文向大家介绍C# .net实现货币转换示例,包括了C# .net实现货币转换示例的使用技巧和注意事项,需要的朋友参考一下 本文所述C# .net实现货币转换示例主要利用string.format 和cultureInfo 来进行转换。分享给大家供大家参考之用。具体方法如下: 主要实现代码如下: 希望本文所述对大家的C#程序设计有所帮助

  • 问题内容: 我试图在网页上运行一个进程,该进程将实时返回其输出。例如,如果我运行“ ping”进程,则它应在每次返回新行时更新页面(现在,当我使用exec(command,output)时,我被迫使用- c选项,等到进程完成后才能看到在我的网页上输出)。是否可以在php中做到这一点? 我也想知道当有人离开页面时杀死这种过程的正确方法是什么。在“ ping”进程的情况下,我仍然可以在系统监视器中看到