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

如何正确实现runOnUiThread Android

彭仲卿
2023-03-14

我需要使用runOnUiThread来更新UI中的TextView,同时在从WebService获取一些字符串的工作线程中更新TextView。我看了一些其他的帖子,并试图实现提供的解决方案,但当我启动我的应用程序,它崩溃。我不太熟悉这个方法,所以我需要一些方向,如何解决这个问题。

Activity updateUI;

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

    updateUI = this;

    itemList = new ArrayList<>();

    new GetItemAvailability().execute();

}

@Override
    public Void doInBackground(Void... arg0) {
        HttpHandler handler = new HttpHandler();

        String JSON_DATA = handler.makeServiceCall(url);

        Log.e(TAG, "Response from url: " + JSON_DATA);

        if (JSON_DATA != null) {
            JSON_DATA = JSON_DATA.substring(JSON_DATA.indexOf('{'),JSON_DATA.lastIndexOf('}')+1);
            Log.e(TAG, "Substring of response: " + JSON_DATA);
            try {
                JSONObject reader = new JSONObject(JSON_DATA);

                JSONObject availability = reader.getJSONObject("availability");

                final String availableQuantity = availability.getString("availableQuantity");
                final String defaultBranch = availability.getString("defaultBranch");
                final String defaultInventoryBranch = availability.getString("defaultInventoryBranch");
                final String inventoryBranch = availability.getString("inventoryBranch");
                final String footage = availability.getString("footage");
                final String anticipatedStockDate = availability.getString("anticipatedStockDate");
                final String discontinuedItemFlag = availability.getString("discontinuedItemFlag");
                final String mdc = availability.getString("mdc");
                final String mdcquantity = availability.getString("mdcquantity");

                HashMap<String, String> item = new HashMap<>();

                item.put("availableQuantity", availableQuantity);
                item.put("defaultBranch", defaultBranch);
                item.put("defaultInventoryBranch", defaultInventoryBranch);
                item.put("inventoryBranch", inventoryBranch);
                item.put("footage", footage);
                item.put("anticipatedStockDate", anticipatedStockDate);
                item.put("discontinuedItemFlag", discontinuedItemFlag);
                item.put("mdc", mdc);
                item.put("mdcquantity", mdcquantity);

                itemList.add(item);

                updateUI.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvAvailableQuantity.setText(availableQuantity);
                        tvDefaultBranch.setText(defaultBranch);
                        tvDefaultInventoryBranch.setText(defaultInventoryBranch);
                        tvInventoryBranch.setText(inventoryBranch);
                        tvFootage.setText(footage);
                        tvAnticipatedStockDate.setText(anticipatedStockDate);
                        tvDiscontinuedItemFlag.setText(discontinuedItemFlag);
                        tvMdc.setText(mdc);
                        tvMdcquantity.setText(mdcquantity);
                    }
                });

            }

共有1个答案

危卜鹰
2023-03-14

您对runOnUiThread()的实现是正确的。您向它传递一个在UI线程上运行的runnable。

但是,在您的情况下,如果将AsyncTask的结果类型更改为String,我认为这甚至没有必要,您可以简单地从doInBackground()方法返回json_data并将其余代码移到onPostExecute()中,该代码无论如何都运行在UI线程上。

 类似资料:
  • 我有一个android应用程序,我正在尝试在其中实现linkedIn登录。LinkedIn SDK已经成功集成,我正在获取用户信息以及电子邮件地址。 以下是我的应用程序在谷歌登录时的工作方式: 1)在手机上获取访问令牌 2)发送带有访问令牌的电子邮件地址到服务器 3) 用我通过谷歌的webapi收到的访问令牌获取用户的详细信息。 4) 如果回复电子邮件与从移动设备接收的电子邮件匹配,则检查该电子邮

  • 问题内容: 我上课很难。麻烦的是,我正在尝试将包裹中的一个成员写入对象,这是一个对象。的是,和对象()在列表中的。 以下是相关代码: 我在“ //帮助这里”标记了两个点,以了解如何正确地写包裹以及如何对其进行重建。如果经过(正确测试),我该如何正确执行? 问题答案: 你差点知道了! 您只需要做: 就这样! 对于您的Integer列表,您还可以执行以下操作: 它应该工作。

  • 我正在寻找关于如何以及何时实现dispose模式的建议。 我已经阅读了MSDN关于如何实现dispose()模式的文章。说得通。我在我的类中实现了它,但它似乎对内存使用没有什么影响。 有点背景,我正在建立一个2D自顶向下的游戏引擎。我有一个名为Gatherer的单元,它继承自Actor(一个用于绘制sprite和跟踪viewplane的基本类),它们是一些简单的sprite。它们在5轮比赛后消失。

  • 我有一个Money类,它带有用于数值和字符串值的工厂方法。我想使用它作为我的输入POJO的属性。 我为它创建了一些转换器,这是字符串: 我有一个需要POJO的endpoint: 最后,这是请求体: 尝试此请求时出现以下错误: 我是不是漏掉了什么? 编辑:正如所问的,下面是金钱类:

  • 我读到过,在中包含异步是async/await的反模式。下面的代码可以工作,但是我想知道如果没有中的,如何实现相同的结果。 谢了。

  • 问题内容: 我正在努力在程序中实现一个对话框。主程序不使用阶段。但是,当用户的生存时间为0时,我想弹出一个对话框,以重新启动游戏或退出游戏。 我使用以下代码为对话框创建了一个单独的类。 游戏主屏幕不使用舞台。在更新方法中,如果肝脏为0,则创建GameOver类 在render方法中,我绘制了舞台 第一次创建对话框时,这可以完美地工作。当点击重新启动时,游戏将重新启动(或实际上重置比分并生效)。但是