【发布时间】:2020-12-25 21:51:15
【问题描述】:
我之前开发了一个实时货币转换器程序,并希望将其导出为 Android 应用程序。
为此,我使用带有 RestTemplate 的 GET 请求来获取两种货币之间的汇率。但是,然后我收到此错误:android.os.NetworkOnMainThreadException
这是我第一次尝试的代码:
public void displayResult(View view) {
TextView output = (TextView) findViewById(R.id.conversion);
output.setInputType(InputType.TYPE_CLASS_NUMBER);
output.setText(String.valueOf(convert()));
}
float convert() {
EditText textBaseCurrency = (EditText) findViewById(R.id.BASE_CURRENCY);
EditText textTargetCurrency = (EditText) findViewById(R.id.TARGET_CURRENCY);
EditText textAmount = (EditText) findViewById(R.id.AMOUNT);
String baseCurrency = textBaseCurrency.getText().toString().toUpperCase();
String targetCurrency = textTargetCurrency.getText().toString().toUpperCase();
float amount = Integer.parseInt(textAmount.getText().toString());
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
String url = "https://v6.exchangerate-api.com/v6/" + API_KEY + "/latest/" + baseCurrency;
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
System.out.println(responseEntity);
ObjectMapper mapper = new ObjectMapper();
JsonNode root = null;
try {
root = mapper.readTree(responseEntity.getBody());
} catch (IOException e) {
e.printStackTrace();
}
JsonNode name = root.get(conversionRates);
JsonNode rates = name.get(targetCurrency);
float rate = rates.floatValue();
float newAmount = rate * amount;
return newAmount;
}
我看到解决方案是使用AsyncTask。我试过了,但没有成功:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Connection().execute();
}
public class Connection extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
EditText textBaseCurrency = (EditText) findViewById(R.id.BASE_CURRENCY);
EditText textTargetCurrency = (EditText) findViewById(R.id.TARGET_CURRENCY);
EditText textAmount = (EditText) findViewById(R.id.AMOUNT);
String baseCurrency = textBaseCurrency.getText().toString().toUpperCase();
String targetCurrency = textTargetCurrency.getText().toString().toUpperCase();
float amount = Integer.parseInt(textAmount.getText().toString());
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
String url = "https://v6.exchangerate-api.com/v6/" + API_KEY + "/latest/" + baseCurrency;
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
System.out.println(responseEntity);
ObjectMapper mapper = new ObjectMapper();
JsonNode root = null;
try {
root = mapper.readTree(responseEntity.getBody());
} catch (IOException e) {
e.printStackTrace();
}
JsonNode name = root.get(conversionRates);
JsonNode rates = name.get(targetCurrency);
float rate = rates.floatValue();
float newAmount = rate * amount;
return null;
}
此外,现在已弃用。
我的 gradle.build 文件:
packagingOptions{
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
}dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.10.6'
implementation 'javax.xml.stream:stax-api:1.0'
implementation 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE'
}
我还在我的AndroidManifest.xml 中添加了 <uses-permission android:name="android.permission.INTERNET" />
【问题讨论】:
-
I saw that the solution would be to use AsyncTask. I tried it, but I wasn't successful.- 显示您尝试过的内容,这是正确的方法。您可以将AsyncTask换成其他解决方案,例如喜欢HERE