Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.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
Java 计时器停止应用程序_Java_Android - Fatal编程技术网

Java 计时器停止应用程序

Java 计时器停止应用程序,java,android,Java,Android,在我的应用程序中,我有一个计时器。但是,当我在计时器内制作一个烤面包片时,应用程序就会崩溃。但当我只增加一个变量时,计时器就工作了 这是我的密码: package com.dev.moritz.colora; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.InputType; import android.view.MotionEvent; impor

在我的应用程序中,我有一个
计时器
。但是,当我在
计时器内制作一个
烤面包片时,应用程序就会崩溃。但当我只增加一个变量时,计时器就工作了

这是我的密码:

package com.dev.moritz.colora;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.InputType;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;

import java.util.Timer;
import java.util.TimerTask;

public class gameActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.activity_game);

        startGame();
    }

public void startGame() {
        Timer ballMovement = new Timer();
        ballMovement.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {

                Toast.makeText(getApplicationContext(), "Round", Toast.LENGTH_SHORT).show();

            }
        }, 0, 5000);
    }

}
我希望任何人都能帮助我。 莫里茨

试试这个:

public void startGame() {
    Timer ballMovement = new Timer();
    ballMovement.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(), "Round", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }, 0, 5000);
}

我在我这边试过了,现在效果很好:

您必须具有RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序

要解决上述问题,请将方法更改为:

public void startGame() {
    Timer ballMovement = new Timer();
    ballMovement.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(Main2Activity.this, "Round", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }, 0, 5000);
}

使用runOnUiThread试试下面的代码

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), "Round", Toast.LENGTH_SHORT).show();
            }
        });
这是一个您可以尝试的选项

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
   private Handler updateUI = new Handler() {
       @Override
      public void dispatchMessage(Message msg) {
           super.dispatchMessage(msg);
           Toast.makeText(MainActivity.this, "142", Toast.LENGTH_SHORT).show();
       }
   };
   public void run() {
       try {
           updateUI.sendEmptyMessage(0);
       } catch (Exception e) { e.printStackTrace(); }
   }
}, 0, 5000); // time in milliseconds
原因: 任何在非UI线程上运行的任务都无法与UI交互

因此,当您想从计时器任务更新UI时,其中一种方法是使用来自类的代码,将使用的代码片段放入
run()方法中:

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(gameActivity.this, "Round", Toast.LENGTH_SHORT).show();
            }
        });

它将按预期工作。

当应用程序崩溃时,请发布错误日志您的日志猫?您的“计时器类阻止主线程”和“无法与UI线程工作或交互”是什么意思?计时器的整体思想是它不会阻塞创建它的线程。当然,您可以使用
处理程序与另一个线程的主线程进行交互。不允许在非主线程上执行与UI相关的工作,如
计时器
callback@0xDEADC0DE是的,您可以使用runOnUiThread或消息和处理程序与UI交互。
runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(gameActivity.this, "Round", Toast.LENGTH_SHORT).show();
            }
        });