Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在我的程序运行时,如何保持UI元素的响应性?_Android_User Interface_Android Ndk - Fatal编程技术网

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

Android 在我的程序运行时,如何保持UI元素的响应性?,android,user-interface,android-ndk,Android,User Interface,Android Ndk,我正在创建的UI中包含一个按钮,一旦按下该按钮,就应该重复查找和显示值,直到用户再次按下该按钮 这是我的按钮在侦听器中的初始化: pollOn = false; pollButton = (Button) findViewById( R.id.pollButton ); pollButton.setOnClickListener( new OnClickListener() { public void onClick(View v) { // TO

我正在创建的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次,然后停止

因此,当我最初按下
POLL按钮时,UI冻结,并且
Log.I(“POLL按钮”、“onClick”)
显示在
LogCat
的顶部。然后,我按下
pollButton
,而它看起来是冻结的,在所有工作完成且UI解冻后,
Log.I(“POLL按钮”、“onClick”)
显示在我的
LogCat
的最后。我解释这一点的方式是,按钮单击被输入到队列中,并且在for循环的所有5次迭代完成后调用
onClick
方法

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

如果有任何不清楚或令人困惑的地方,请让我知道,我会尽力澄清


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

因为您正在系统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,因此可能存在我不知道的差异。

在另一个线程上使用它。使用调用方法来读取和显示数据。

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

异步任务:

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

线程:

它们是简单的可运行线程。您可以使用这些线程执行非UI任务,但不能在其中执行UI任务(因为UI不是线程安全的)。要在这些线程中处理UI,您必须使用
处理程序
,这对于初学者掌握和理解它们是相当麻烦的

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