【问题标题】:How can I access an array index in ASyncTask for my UI Updating?如何访问 ASyncTask 中的数组索引以进行 UI 更新?
【发布时间】:2014-03-06 21:00:34
【问题描述】:

我有一个 ASyncTask 正在为我的 UserInterface 运行更新;但我不确定如何访问我的 AnalogInput[] 参数并在调用 publishProgress() 时检查我当前所在的索引;

private class AnalogUpdater extends AsyncTask<AnalogInput[], Float, Void> {

    // A callback method executed on non UI thread, invoked after
    // onPreExecute method if exists

    // Takes a set of parameters of the type defined in your class
    // implementation. This method will be
    // executed on the background thread, so it must not attempt to interact
    // with UI objects.
    @Override
    protected Void doInBackground(AnalogInput[]... params) {

        try {
            for (int i = 0; i < 15; i++) {
                publishProgress(params[0][i].getVoltage());
            }

        } catch (ConnectionLostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    protected void onProgressUpdate(Float... f) {
        // Getting reference to the TextView tv_counter of the layout
        // activity_main
        final String str = String.format("Voltage: %.2f", f);
        final int v = Math.round(f[0] * 100);
        switch (idx // How can I get this index?) {
        case 1:
            analogInput0VoltageText.setText(str);
            analogInput0VoltageBar.setProgress(v);
            break;
        case 2:
            analogInput1VoltageText.setText(str);
            analogInput1VoltageBar.setProgress(v);
            break;
        case 3:
            analogInput2VoltageText.setText(str);
            analogInput2VoltageBar.setProgress(v);
            break;
        case 4:
            analogInput3VoltageText.setText(str);
            analogInput3VoltageBar.setProgress(v);
            break;
        case 5:
            analogInput4VoltageText.setText(str);
            analogInput4VoltageBar.setProgress(v);
            break;
        case 6:
            analogInput5VoltageText.setText(str);
            analogInput5VoltageBar.setProgress(v);
            break;
        case 7:
            analogInput6VoltageText.setText(str);
            analogInput6VoltageBar.setProgress(v);
            break;
        case 8:
            analogInput7VoltageText.setText(str);
            analogInput7VoltageBar.setProgress(v);
            break;
        case 9:
            analogInput8VoltageText.setText(str);
            analogInput8VoltageBar.setProgress(v);
            break;
        case 10:
            analogInput9VoltageText.setText(str);
            analogInput9VoltageBar.setProgress(v);
            break;
        case 11:
            analogInput10VoltageText.setText(str);
            analogInput10VoltageBar.setProgress(v);
            break;
        case 12:
            analogInput11VoltageText.setText(str);
            analogInput11VoltageBar.setProgress(v);
            break;
        case 13:
            analogInput12VoltageText.setText(str);
            analogInput12VoltageBar.setProgress(v);
            break;
        case 14:
            analogInput13VoltageText.setText(str);
            analogInput13VoltageBar.setProgress(v);
            break;
        case 15:
            analogInput14VoltageText.setText(str);
            analogInput14VoltageBar.setProgress(v);
            break;
        case 16:
            analogInput15VoltageText.setText(str);
            analogInput15VoltageBar.setProgress(v);
            break;
        }

    }

希望这很清楚;参考评论“我怎样才能得到这个索引?”在代码中。 }

【问题讨论】:

  • 好吧,你可以创建一个小对象来保存电压和索引,然后将两者一起传递到同一个对象中,而不是只传递一个浮点数。
  • 所以就像一个新的Java对象类,带有索引和电压的构造函数;那么只需将 AsyncTask Progress 更改为新对象的类型?
  • 是的。这就是我会做的。
  • 我试一试;谢谢!

标签: android arrays asynchronous android-asynctask


【解决方案1】:

您可以使用数组作为 asyncTask 的第二个参数(可能不是必需的,我不记得了)

private class AnalogUpdater extends AsyncTask<AnalogInput[], Float[], Void>

同时传递值、电压和索引(将索引转换为浮点数)

publishProgress(params[0][i].getVoltage(), (float)i);

稍后再使用(再次转换为 int)

protected void onProgressUpdate(Float... f)
{
    idx = (int)f[1];
}

【讨论】:

  • 这会更容易,这是我的第一个想法,但我担心四舍五入错误。我想你总是可以在投射之前添加 0.5。
  • @SteveSchwarcz 将int 转换为float 然后向后转换应该是安全的(将float 转换为int 然后向后转换肯定不会奏效)。
  • 我最终接近了史蒂夫推荐的对象方法;但我将就相关问题发布后续问题。
猜你喜欢
  • 2020-08-31
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
相关资源
最近更新 更多