Android 在我的程序运行时,如何保持UI元素的响应性?
我正在创建的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
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,您必须使用处理程序
,这对于初学者掌握和理解它们是相当麻烦的
因此,根据您的需求和应用程序,您可以选择最适合您的应用程序