我正在创建的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冻结有关,但它肯定会增加所需的处理时间。
如果有任何不清楚或令人困惑的事情,请告诉我,我会尽力澄清事情。
非常感谢有关这种情况的任何信息。
答案 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。