Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.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 您能否将代码设置为在不使用单独方法的情况下按间隔运行?_Android_Timer_Repeat_Procedure - Fatal编程技术网

Android 您能否将代码设置为在不使用单独方法的情况下按间隔运行?

Android 您能否将代码设置为在不使用单独方法的情况下按间隔运行?,android,timer,repeat,procedure,Android,Timer,Repeat,Procedure,我想在计时器上设置一些代码,但当我使用计时器时,会得到一个android.view.ViewRootImpl$CalledFromErrorThreadException。所以我想知道是否有其他方法来编码,这样我就不会出错?我曾研究过使用其他一些重复代码的计时器,但它们似乎都使用了一个公共的空白,并假定会做同样的事情 TimerTask task = new TimerTask() { @Override public void run() {

我想在计时器上设置一些代码,但当我使用计时器时,会得到一个android.view.ViewRootImpl$CalledFromErrorThreadException。所以我想知道是否有其他方法来编码,这样我就不会出错?我曾研究过使用其他一些重复代码的计时器,但它们似乎都使用了一个公共的空白,并假定会做同样的事情

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

}
});