在程序运行时如何保持UI元素的响应?

时间:2013-07-29 20:30:02

标签: android user-interface android-ndk

我正在创建的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;
            }
        }
    });

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

因此,当我最初按pollButton时,用户界面会冻结,Log.i("POLL BUTTON", "onClick")会显示在LogCat的顶部。然后,当pollButton显示为冻结时,我按下Log.i("POLL BUTTON", "onClick"),在完成所有工作并且UI解冻后,LogCat显示在onClick的最后。我解释这个的方式是按钮单击进入队列,并且在for循环的所有5次迭代完成后调用{{1}}方法。

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

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

非常感谢有关这种情况的任何信息。

3 个答案:

答案 0 :(得分:1)

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

<强>的AsyncTask:

这是一个有一些方法的类,可以帮助您在更新UI的同时进行耗时的工作。例如:如果要搜索大文档中的特定单词,请在doInBackground()(AsyncTask类的方法)中读取和搜索内容,然后您可以显示进度条并通知用户您的进度onProgressUpdate()。这为您的应用程序提供了更专业的感觉,同时帮助您在后台执行耗时的任务。

<强>主题:

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

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

答案 1 :(得分:0)

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

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

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

如果您想更新自己的用户界面:

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

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

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

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

答案 2 :(得分:0)

在另一个主题上执行此操作。使用AsyncTask调用methodToReadAndDisplayData。