Android 您能否将代码设置为在不使用单独方法的情况下按间隔运行?
我想在计时器上设置一些代码,但当我使用计时器时,会得到一个android.view.ViewRootImpl$CalledFromErrorThreadException。所以我想知道是否有其他方法来编码,这样我就不会出错?我曾研究过使用其他一些重复代码的计时器,但它们似乎都使用了一个公共的空白,并假定会做同样的事情Android 您能否将代码设置为在不使用单独方法的情况下按间隔运行?,android,timer,repeat,procedure,Android,Timer,Repeat,Procedure,我想在计时器上设置一些代码,但当我使用计时器时,会得到一个android.view.ViewRootImpl$CalledFromErrorThreadException。所以我想知道是否有其他方法来编码,这样我就不会出错?我曾研究过使用其他一些重复代码的计时器,但它们似乎都使用了一个公共的空白,并假定会做同样的事情 TimerTask task = new TimerTask() { @Override public void run() {
TimerTask task = new TimerTask() {
@Override
public void run() {
rvMessagesSubjectGroupPage.setLayoutManager(new LinearLayoutManager(SubjectGroupPage.this, RecyclerView.VERTICAL, true));
final ArrayList<MessageObj> messages = new ArrayList<>();
ArrayList<MessageObj> messagesAdap = readMessages(rvMessagesSubjectGroupPage, messages);
mMessageAdapter = new MessageListAdapter(SubjectGroupPage.this, messagesAdap);
rvMessagesSubjectGroupPage.setAdapter(mMessageAdapter);
rvMessagesSubjectGroupPage.scrollToPosition(5);
}
};
Timer timer = new Timer();
long delay = 0;
long intevalPeriod = 1000;
timer.scheduleAtFixedRate(task, delay, intevalPeriod);
}
public ArrayList<MessageObj> readMessages(final RecyclerView rv, final ArrayList<MessageObj> messages) {
db.collection("messagesIT")
.orderBy("Timesent", Query.Direction.DESCENDING)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task){
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
String message = document.getString("Message");
String senderName = document.getString("SenderName");
String sender = document.getString("Sender");
Timestamp ts = document.getTimestamp("Timesent");
Date timesent = ts.toDate();
MessageObj mess;
sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedpreferences.edit();
if (currentUser.getUid().equals(sender)) {
mess = new MessageObj(message, sender, senderName, timesent, true);
editor.putBoolean("isCurrentUser", true);
editor.commit();
} else {
mess = new MessageObj(message, sender, senderName, timesent, false);
editor.putBoolean("isCurrentUser", false);
editor.commit();
}
messages.add(mess);
}
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
showToast("There has been an error, please try again later.");
Log.d(TAG, "Error: " + e);
}
});
return messages;
}
任何与UI相关的操作都应该在UI线程中完成。默认情况下,它是UI线程,但计时器在后台任务中运行 因此,在计时器线程中,实现修改此块中UI中任何内容的代码
runOnUiThread(new Runnable() {
@Override
public void run() {
// Stuff that updates the UI
}
});
可能重复的
runOnUiThread(new Runnable() {
@Override
public void run() {
// Stuff that updates the UI
}
});