如何在 Android 中运行 AsyncTask?

Posted

技术标签:

【中文标题】如何在 Android 中运行 AsyncTask?【英文标题】:How to run AsyncTask in Android? 【发布时间】:2020-12-30 02:21:14 【问题描述】:

我之前编写了一个简单的货币转换器程序,它通过汇率 API 获取实时汇率转换。完整代码在这里:https://github.com/LaChope/expenses-robot

我想知道重用大部分代码来构建 android 应用程序,但我真的不熟悉 AsyncTask 并且知道如何实现它(我需要它来处理 GET 请求)。

这是我目前所实施的,但我不确定这是正确的继续方式。

我的转换器类:

public class Converter extends AsyncTask<Void, Void, Float> 
    private final RestTemplate restTemplate = new RestTemplate();
    private final EditText baseCurrency;
    private final EditText targetCurrency;
    private final EditText amount;

    public Converter(EditText baseCurrency, EditText targetCurrency, EditText amount) 
        this.baseCurrency = baseCurrency;
        this.targetCurrency = targetCurrency;
        this.amount = amount;
    

    @Override
    protected Float doInBackground(Void... voids) 
        String url = "https://api.exchangeratesapi.io/latest?" + baseCurrency;
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);

        ObjectMapper mapper = new ObjectMapper();
        JsonNode root = null;
        try 
            root = mapper.readTree(responseEntity.getBody());
         catch (IOException e) 
            e.printStackTrace();
        
        String rates1 = "rates";
        JsonNode name = root.get(rates1);
        JsonNode rates = name.get(String.valueOf(targetCurrency));
        float rate = rates.floatValue();

        return rate;
    

    @Override
    protected void onPostExecute(Float rate) 
        super.onPostExecute(rate);
        output.setText();
        return;
    

我的 MainActivity 类:

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    

    public void displayResult(View view) 
        EditText textBaseCurrency = (EditText) findViewById(R.id.base_currency);
        EditText textTargetCurrency = (EditText) findViewById(R.id.target_currency);
        EditText textAmount = (EditText) findViewById(R.id.amount);
        TextView output = (TextView) findViewById(R.id.result);
        output.setInputType(InputType.TYPE_CLASS_NUMBER);

        Converter converter = new Converter(textBaseCurrency, textTargetCurrency, textAmount);
        output.setText();
    

如何将我在 Converter 类中进行的转换的输出传达给 MainActivity 以显示它?

【问题讨论】:

converter.execute(); 丢失。在 onPostExecute 中,您可以显示结果,这就是您几乎要做的。 output.setText(result); 【参考方案1】:

将 AsyncTask 初始化为

Converter converter = new Converter(textBaseCurrency, textTargetCurrency, textAmount);    
converter.execute();

然后AsyncTask中的代码就开始执行了。

onPostExecute(Float rate) 中分配output.setText();

【讨论】:

问题是output.setText(); 需要TextView output = (TextView) findViewById(R.id.result); output.setInputType(InputType.TYPE_CLASS_NUMBER); 而我不能把它放在Converter.java 类中,对吧?

以上是关于如何在 Android 中运行 AsyncTask?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android开发中用AsyncTask异步更新UI界面

如何在android的Asynctask中显示json响应[重复]

在服务中运行 AsyncTask - Android

如何在 android 中将 asynctask 代码更改为 rxandroid 代码?

Android - 强制取消 AsyncTask

如何使用 AsyncTask 的 onPostExecute 方法更新 Android 中的变量