【问题标题】:Generate android buttons with while loop in separate thread在单独的线程中生成带有while循环的android按钮
【发布时间】:2013-09-01 21:26:33
【问题描述】:

我迷路了。我需要在应用程序启动时读取目录中的文件并从中制作按钮。我必须使用 while 循环,并且必须更新 UI。我已经尝试了很长一段时间来运行一个可运行文件,并且只有循环内的代码在 UI 线程中运行。我对 android 比较陌生,但这似乎很简单。

这段代码就是我现在所拥有的。它不会抛出任何错误或警告,但它什么也不做。我知道按钮制作代码有效,因为“添加按钮”按钮可以正确制作按钮。我不知道为什么它不起作用。 (这在 OnCreate 中运行)

Runnable aRunnable = new Runnable() {

    public void run() {
        Looper.prepare();
        File f = new File(Environment.getExternalStorageDirectory() + "/myapp/");
        File[] filearray = f.listFiles();
        int amount = filearray.length;
        final String[] files = new String[amount];
        int count = 0;
        while (count != amount) {
            files[count] = filearray[count].toString();
            count += 1;
        }
        int times = files.length;
        int counter = 0;
        while (counter != times) {
            Handler handler = new Handler();
            handler.post(new Runnable() {
                public void run() {
                    // Button making code
                }
            });
        }
        Looper.loop();
    }
};
Thread thread = new Thread(aRunnable);
thread.start();

【问题讨论】:

  • 你能定义“它不工作”吗?您说“按钮制作代码”有效,并且您没有错误或警告,所以发生了什么/没有发生什么?
  • 应用程序启动并运行良好,但没有生成任何按钮。

标签: android multithreading user-interface


【解决方案1】:

您现有代码的一个问题是run() 方法中的所有内容都在后台线程上运行,而不是在主线程(有时称为UI)线程上运行。

这是您创建处理程序对象的地方:

        Handler handler = new Handler();

这是不正确的。如果使用默认构造函数,您需要在主线程上创建(实例化)Handler。来自the Handler docs

public Handler () 在 API 级别 1 中添加

默认构造函数将此处理程序与 Looper 相关联 当前线程。如果这个线程没有looper,这个handler 将无法接收消息,因此引发异常。

因此,一个简单的解决方法就是将那行代码更早地移动到您知道在主线程上运行的位置。 For example, in Activity#onCreate():

public void onCreate(Bundle b) {
   super.onCreate(b);

   handler = new Handler();
}

其中handler改为成员变量:

private Handler handler;

另外,只需删除您的 Looper 电话。

See this article for more on Handler.

其他选项

另一种选择是完全避免使用Handler,并熟悉AsyncTask class。我个人认为这对于新开发人员来说更容易使用。我展示的 vogella.com 链接也有关于 AsyncTask 的良好信息。

还有一种选择是避免使用Handler,并在Activity 中使用runOnUiThread() 方法来添加按钮。

【讨论】:

    【解决方案2】:

    在我看来,您正在尝试创建一个基于某个数组的按钮列表。这似乎是 ListView 和自定义数组适配器的工作。我相信你应该用谷歌搜索一些例子(互联网上有数十亿,这是一个相当基本的 android 模式)。

    在学习过程中,不要忘记检查如何在 Java 中使用 for(),所有这些 while 循环都太丑陋了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      相关资源
      最近更新 更多