java - Android IllegalAccessError java.util.concurrent.TimeUnit.toMinutes

标签 java android

我目前正在开发我的第一个完整的 Android 应用程序。我正在开发一个数学大脑训练游戏,所以我需要一个倒计时器。因此,我使用 Android 的 CountDownTimer 来构建它。

以下是我的 GameActivity.java 类的 Java 代码,我用它来控制我的游戏。

package lk.iit.mobiletechnology.mathematicsbraintrainer;

import java.util.concurrent.TimeUnit;

import lk.iit.mobiletechnology.mathematicsbraintrainer.entity.Challenge;
import lk.iit.mobiletechnology.mathematicsbraintrainer.entity.Game;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@SuppressLint("NewApi")
public class GameActivity extends ActionBarActivity {

    private Game game;
    private Challenge currentChallenge;
    private int questionCount;
    private TextView timeView;
    private TextView question;
    private EditText inputField;

    private static final String TAG = "Brain Trainer" ;
    private static final int MAXIMUM_QUESTIONS = 10;
    public static final String KEY_DIFFICULTY = "lk.iit.mobiletechnology.mathematicsbraintrainer.difficulty";
    public static final int DIFFICULTY_NOVICE = 0;
    public static final int DIFFICULTY_EASY = 1;
    public static final int DIFFICULTY_MEDIUM = 2;
    public static final int DIFFICULTY_GURU = 3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

        int difficultyLevel = this.getIntent().getIntExtra(KEY_DIFFICULTY, GameActivity.DIFFICULTY_NOVICE);
        this.game = new Game(GameActivity.MAXIMUM_QUESTIONS, difficultyLevel);
        this.questionCount = 0;

        this.question = (TextView)(this.findViewById(R.id.question_text));
        currentChallenge = this.game.getChallenges().get(questionCount);
        question.setText(currentChallenge.toString());
        this.timeView = (TextView)(this.findViewById(R.id.time_text));
        timeView.setText("00:10");

        final CountDownMachine timer = new CountDownMachine(10000, 1000);
        timer.start();

        this.setButtonClickListener();
    }

    private void setButtonClickListener() {
        Button testButton = (Button)(findViewById(R.id.test_button));
        inputField = (EditText)(findViewById(R.id.question_input));
        testButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {               
                double inputValue = Double.parseDouble(inputField.getText().toString());
                ImageView imageView = (ImageView)(findViewById(R.id.answer_feedback));
                Drawable drawable;
                if(questionCount < 10) {

                    if(currentChallenge.correctAnswer(inputValue)) {
                        drawable = getResources().getDrawable(R.drawable.fixed_correct_image);
                        imageView.setImageDrawable(drawable);
                    }
                    else {
                        drawable = getResources().getDrawable(R.drawable.fixed_wrong_image);
                        imageView.setImageDrawable(drawable);
                    }

                    questionCount++;
                    if(questionCount == 5) {
                        //Intent intent = new Intent(, UserEntryActivity.class);
                        finish();

                    }

                    currentChallenge = game.getChallenges().get(questionCount);
                    question.setText(currentChallenge.toString());
                    inputField.setText(" ?");
                }
            }
        });
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @SuppressLint("NewApi")
    public class CountDownMachine extends CountDownTimer {

        public CountDownMachine(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        @SuppressLint("NewApi")
        @Override
        public void onTick(long millisUntilFinished) {
            long timeRemaining = millisUntilFinished;
            String text = String.format("%02d:%02d", (TimeUnit.MILLISECONDS.toMinutes(timeRemaining) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeRemaining))), (TimeUnit.MILLISECONDS.toSeconds(timeRemaining) - (TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeRemaining)))));
            timeView.setText(text);
        }

        @Override
        public void onFinish() {
            ImageView imageView = (ImageView)(findViewById(R.id.answer_feedback));
            Drawable drawable;
            if(!(inputField.getText().toString().equals(""))) {
                double inputValue = Double.parseDouble(inputField.getText().toString());
                if(questionCount < 10) {
                    if(currentChallenge.correctAnswer(inputValue)) {
                        drawable = getResources().getDrawable(R.drawable.fixed_correct_image);
                        imageView.setImageDrawable(drawable);
                    }
                    else {
                        drawable = getResources().getDrawable(R.drawable.fixed_wrong_image);
                        imageView.setImageDrawable(drawable);
                    }
                }
            }
            else {
                drawable = getResources().getDrawable(R.drawable.fixed_wrong_image);
                imageView.setImageDrawable(drawable);
            }
            questionCount++;
            if(questionCount == 5) {
                finish();
            }
            currentChallenge = game.getChallenges().get(questionCount);
            question.setText(currentChallenge.toString());
            inputField.setText(" ?");
            timeView.setText("00:10");
        }

    }

}

定义布局的关联activity_game.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="@color/background"
    tools:context="lk.iit.mobiletechnology.mathematicsbraintrainer.GameActivity" >

    <TextView 
        android:id="@+id/time_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:textSize="15sp"
        android:textStyle="bold"
        android:textColor="#000"
        />

    <TextView 
        android:id="@+id/question_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:textSize="15sp"
        android:textStyle="bold"
        android:textColor="#000"
        android:layout_below="@+id/time_text"
        />

    <EditText 
        android:id="@+id/question_input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal|numberSigned"
        android:text=" ?"
        android:layout_below="@+id/question_text"
        android:background="#fff"
        />

    <ImageView 
        android:id="@+id/answer_feedback"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/image_text_gap"
        android:layout_below="@+id/question_input"
        android:layout_centerHorizontal="true"
        />

    <Button 
        android:id="@+id/test_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test"
        android:layout_below="@+id/answer_feedback"
        android:layout_centerHorizontal="true"
        />

</RelativeLayout>

请注意,这个 java 类仍然没有涵盖全部要求,但它能够在每次游戏期间触发 10 个问题。 我已经引入了计时器,但自从调用timer.start()方法以来,我不断收到以下异常:

Android IllegalAccessError java.util.concurrent.TimeUnit.toMinutes

由于我是这个开发领域的新手,而且很难找到合适的解决方案,如果有人可以帮助我解释为什么我会得到这个以及存在什么样的解决方案,我将不胜感激。

这是我收到的异常的 logcat 内容:

03-06 01:52:59.328: D/AndroidRuntime(278): Shutting down VM
03-06 01:52:59.328: W/dalvikvm(278): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
03-06 01:52:59.348: E/AndroidRuntime(278): FATAL EXCEPTION: main
03-06 01:52:59.348: E/AndroidRuntime(278): java.lang.IllegalAccessError: tried to access method java.util.concurrent.TimeUnit.toMinutes:(J)V from class lk.iit.mobiletechnology.mathematicsbraintrainer.GameActivity$CountDownMachine
03-06 01:52:59.348: E/AndroidRuntime(278):  at lk.iit.mobiletechnology.mathematicsbraintrainer.GameActivity$CountDownMachine.onTick(GameActivity.java:108)
03-06 01:52:59.348: E/AndroidRuntime(278):  at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:124)
03-06 01:52:59.348: E/AndroidRuntime(278):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-06 01:52:59.348: E/AndroidRuntime(278):  at android.os.Looper.loop(Looper.java:123)
03-06 01:52:59.348: E/AndroidRuntime(278):  at android.app.ActivityThread.main(ActivityThread.java:4627)
03-06 01:52:59.348: E/AndroidRuntime(278):  at java.lang.reflect.Method.invokeNative(Native Method)
03-06 01:52:59.348: E/AndroidRuntime(278):  at java.lang.reflect.Method.invoke(Method.java:521)
03-06 01:52:59.348: E/AndroidRuntime(278):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-06 01:52:59.348: E/AndroidRuntime(278):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-06 01:52:59.348: E/AndroidRuntime(278):  at dalvik.system.NativeStart.main(Native Method)

最佳答案

不要使用TimeUnit将毫秒转换为秒、分钟等,自己动手即可。

int seconds = (millis / 1000) % 60;
int minutes = millis / (1000 * 60);

显然,当 TimeUnit 在运行时不可用时,您会收到此错误,请参阅此处:

Android IllegalAccessError java.util.concurrent.TimeUnit.toHours

关于java - Android IllegalAccessError java.util.concurrent.TimeUnit.toMinutes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28886607/

相关文章:

android - 我遇到安装错误,不知道该怎么办

android - Android 上的 GStreamer 教程获取 RTSP 流的 'Unsupported profile for video/mp4v-es'

java - Web 应用程序的 PHP 前端和 Java 后端?

java - 在 arraylist 中缓存 iterable 以在 reducer 中迭代两次不起作用

java - Android 手机上的绘图应用程序是否需要 xml 布局?

android小部件更新期千分尺不起作用

android - 使用共享首选项创建最喜欢的 ListView

java - 使用 Gradle 在 Android 中加入外部库的选项有哪些?

java - 使用泛型类作为 java List 的类型

java - MapDB 闪存友好性