我有一个Android应用程序,它不断自动更新App的SQLite中的数据列表,ArrayAdapter用于处理数据,所以为此,我从Acitivity的onCreate方法创建了另一个线程或处理程序,在它的代码里面有一个连续的循环,用于更新然后等待(或暂停一段时间,ex / 10秒),涉及两个问题: 1-只有UI线程可以触摸它的视图(虽然我只触及ArrayAdapter,如果它被视为一个视图)。 2-一旦另一个线程开始运行,UI线程似乎卡在其中,即使第一次UI更新也不会更新(完全白色)。 autoUpdate()方法的代码:(在UI onCreate方法的最后一行调用):
public void startAutoUpdateLogData(final int milliseconds){
continueAutoUpdate = true;
new Thread(){
@Override
public void run() {
while(continueAutoUpdate){
try{
Log.v("updating..", "");
updateLogFromDatabase();
Thread.sleep(milliseconds);
}catch(Exception e){
e.printStackTrace();
}
}
}
}.start();
}
OR:
public void startAutoUpdateLogData2(final int milliseconds){
continueAutoUpdate = true;
runOnUiThread(new Runnable() {
@Override
public void run() {
while(continueAutoUpdate){
try{
Log.e("updating...", "");
updateLogFromDatabase();
Thread.sleep(milliseconds);
}catch(Exception e){
e.printStackTrace();
}
}
}
});
}
OR
public void startAutoUpdateLogData3(final int milliseconds){
continueAutoUpdate = true;
final Handler handler = new Handler();
runOnUiThread(new Runnable() {
@Override
public void run() {
while(continueAutoUpdate){
try{
handler.postDelayed(new Runnable(){
public void run(){
Log.e("updating...", "");
updateLogFromDatabase();
}
}, milliseconds);
}catch(Exception e){
e.printStackTrace();
}
}
}
});
}
这些都不起作用。
答案 0 :(得分:1)
你可以做很多事。但是这个将更加接近你所做的解决方案。
private void runThread() {
new Thread() {
public void run() {
while (continueAutoUpdate) {
try {
handler.postDelayed(new Runnable(){
public void run(){
Log.e("updating...", "");
updateLogFromDatabase();
}
}, milliseconds);
Thread.sleep(milliseconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
答案 1 :(得分:1)
在尝试了各种各样的东西之后,我终于找到了解决方案:无论何时你都要执行一些长期任务,你可以分配一个新的Java线程来执行它,但是当需要更新UI时线程,它无法直接访问UI的任何组件,因此在这种情况下,您只需要在另一个线程中使用runOnUiThread()包装代码。 EX /
private void startAutoUpdateLogData(final int milliseconds) {
final Handler handler = new Handler();
continueAutoUpdate = true;
new Thread() {
public void run() {
while (continueAutoUpdate) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e("updating...", "");
updateLogFromDatabase();
}
});
Thread.sleep(milliseconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}