0

我正在创建的 UI 包含一个按钮,一旦按下该按钮,应该会重复查找和显示值,直到用户再次按下该按钮。

这是我的按钮与监听器的初始化:

pollOn = false;
pollButton = (Button) findViewById( R.id.pollButton );
    pollButton.setOnClickListener( new OnClickListener() {
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.i( "POLL BUTTON", "onClick" );
            if( !pollOn ) {
                Log.i( "POLL BUTTON", "!pollOn" );
                pollOn = true;
                methodToReadAndDisplayData();
            } else {
                Log.i( "POLL BUTTON", "else pollOn" );
                pollOn = false;
            }
        }
    });

这里没有显示以使事情更容易阅读,但我目前的工作方式是methodToReadAndDisplayData()在 for 循环中调用 5 次然后停止。

因此,当我pollButton最初按下时,UI 会冻结并Log.i("POLL BUTTON", "onClick")显示在LogCat. 然后我按下pollButton它似乎被冻结的同时,在所有工作完成并且 UI 解冻后,Log.i("POLL BUTTON", "onClick")显示在我的LogCat. 我对此的解释是按钮单击进入队列,并且onClick在 for 循环的所有 5 次迭代完成后调用该方法。

这个问题的另一大部分是正在做的工作主要是在一个原生库中,并且是使用 NDK 调用的。我不确定这是否与 UI 冻结有关,但它肯定会增加所需的处理时间。

如果有任何不清楚或令人困惑的地方,请告诉我,我会尽力澄清事情。

任何有关这种情况的信息将不胜感激。

4

3 回答 3

1

因为您在系统 UI 冻结的主线程上运行,所以您最好在一个新线程中运行,这将使您的 UI 正常运行。以下是如何在新线程中运行您的方法的示例。

new Thread(new Runnable() {
    @Override
    public void run() {
        methodToReadAndDisplayData();
    }
}).start();

请注意,如果您的方法以任何方式与 UI 交互,则需要通过以下方式进行:

当你想更新你的 UI 时:

Handler threadHandler = new Handler();
threadHandler.post(updateRunnable);

在此处更新您的用户界面:

Runnable updateRunnable = new Runnable() {
    public void run() {
        example.setText(newValue);
    }
};

尝试一下,看看是否有任何改进。我没有使用 NDK,只是使用标准 SDK,所以可能存在我不知道的差异。

于 2013-07-29T20:36:39.127 回答
1

在保持 UI 响应式的同时做一些事情可以通过很多方法来实现,其中两种是很常见的。异步任务和线程。

异步任务:

这是一个类,它有一些方法可以帮助您在更新 UI 的同时完成耗时的工作。例如:如果你想在一个大文档中搜索一个特定的单词,在doInBackground()(AsyncTask 类的一个方法)中进行阅读和搜索,你可以显示一个进度条并通知用户你的进度onProgressUpdate()。这给您的应用程序带来更专业的感觉,同时帮助您在后台执行耗时的任务。

主题:

它们是简单的可运行线程。您可以使用这些线程执行非 UI 内容,但不能在其中执行 UI 任务(因为 UI 不是线程安全的)。为了在这些线程中处理 UI,您将不得不使用Handlers,这对于初学者来说很难掌握和理解它们。

因此,根据您的需求和应用程序,您可以选择最适合您的应用程序。

于 2013-07-29T21:13:18.630 回答
0

在另一个线程上做。使用AsyncTask调用 methodToReadAndDisplayData。

于 2013-07-29T20:36:46.257 回答