首页 > 解决方案 > Activity 需要很长时间才能加载

问题描述

我的活动只包含 ViewPager。我生成问题并将它们插入到片段中。我的 ViewPager 包含 30 个元素。我有一个启动 Activity 的菜单,当我第一次启动 Activity 时,它平均启动 3 秒,然后更快。我在开发人员控制台中收到 ANR Input dispatching timed out。我决定以编程方式跟踪onCreate()onWindowFocusChanged()调用之间的时间。

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new Handler(getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i <= 14; i++){
                        fragmentsType1.add(QuestionFragment1.newInstance(questions.get(i)));
                    }
                }
            });

            new Handler(getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    for (int i = 15; i <= 29; i++){
                        fragmentsType2.add(QuestionFragment2.newInstance(questions.get(i)));
                    }
                }
            });

            //I insert everything into 1 list so that there are no problems with locks
            fragments.addAll(fragmentsType1);
            fragments.addAll(fragmentsType2);
    }
        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }

但是我收到错误, FragmentPagerAdapter.getItem()因为列表的大小为 0。因为getItem()在尚未创建片段时调用。我应该怎么办?
这是我的片段。

public class QuestionFragment1 extends Fragment implements TestActivity.DataFragmentListener {

    private OnAnswerSelectedListener callBack;
    private Question question;
    private int questionPosition;
    private int answerState;
    private int correctAnswerIndex;
    private int incorrectAnswerIndex;
    private boolean isGameOver = false;

    private ImageView[] buttons;

    private TextView title;
    private ImageView image1;
    private ImageView image2;
    private ImageView image3;
    private ImageView image4;

    public QuestionFragment1(){}

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentArguments();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.questionFragment, container, false);
        initWidgets(view);
        setQuestion();
        setClickListeners();

        return view;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        boolean isNullListeners = ((TestActivity)context).checkIsNullArrayListeners();
        if (isNullListeners){
           ((TestActivity)context).initListeners();
        }
        ((TestActivity)context).registerDataFragmentListener(this);
    }

    @Override
    public void onDestroy() {
        ((TestActivity) Objects.requireNonNull(getActivity())).unregisterDataFragmentListener(this);
        super.onDestroy();        
    }

    public static QuestionFragment1 newInstance(Question question, int questionPosition){
        QuestionFragment1 fragment = new QuestionFragment1();
        Bundle bundle = new Bundle();
        bundle.putSerializable("Question", question);
        bundle.putInt("QuestionPosition", questionPosition);
        fragment.setArguments(bundle);

        return fragment;
    }

    public void setCallBackListener(OnAnswerSelectedListener callBack){
        this.callBack = callBack;
    }

    private void getFragmentArguments(){
        question = (Question) (getArguments() != null ? getArguments().getSerializable("Question") : null);
        questionPosition = getArguments().getInt("QuestionPosition");
    }

    private void setQuestion(){
        title.setText(Html.fromHtml(question.getTitle()));
        image1.setImageResource(question.getAnswers().get(0).getImagePath());
        image2.setImageResource(question.getAnswers().get(1).getImagePath());
        image3.setImageResource(question.getAnswers().get(2).getImagePath());
        image4.setImageResource(question.getAnswers().get(3).getImagePath());

    }

    private void initWidgets(View view){
        title = view.findViewById(R.id.title);
        image1 = view.findViewById(R.id.image1);
        image2 = view.findViewById(R.id.image2);
        image3 = view.findViewById(R.id.image3);
        image4 = view.findViewById(R.id.image4);

        buttons = new ImageView[]{
                image1,
                image2,
                image3,
                image4};
    }

    private void setClickListeners(){
        image1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkAnswer(question.getAnswers().get(0), 0);
            }
        });

        image2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkAnswer(question.getAnswers().get(1), 1 );
            }
        });

        image3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkAnswer(question.getAnswers().get(2), 2);
            }
        });

        image4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkAnswer(question.getAnswers().get(3), 3);
            }
        });
    }

    private void btnsSetEnableOff(){
        image1.setEnabled(false);
        image2.setEnabled(false);
        image3.setEnabled(false);
        image4.setEnabled(false);
    }

    private void checkAnswerState(){
        if (answerState == 1){
            btnsSetEnableOff();
            buttons[correctAnswerIndex].setBackground(getResources().getDrawable(R.drawable.question_type3_correct_answer_background));
        }else if (answerState == -1){
            btnsSetEnableOff();
            buttons[incorrectAnswerIndex].setBackground(getResources().getDrawable(R.drawable.question_type3_incorrect_answer_background));
            buttons[correctAnswerIndex].setBackground(getResources().getDrawable(R.drawable.question_type3_correct_answer_background));
        }
    }

    private void checkAnswer(Question answer, int btnPos){
        if (question.isCorrectAnswer(answer)){
            answerState = 1;
            btnsSetEnableOff();
            buttons[btnPos].setBackground(getResources().getDrawable(R.drawable.question_type3_correct_answer_background));
            callBack.onAnswerSelected(questionPosition, answerState, btnPos, 0);
        }else {
            answerState = -1;
            btnsSetEnableOff();
            buttons[btnPos].setBackground(getResources().getDrawable(R.drawable.question_type3_incorrect_answer_background));
            for (int i = 0; i < question.getAnswers().size(); i++){
                if (question.isCorrectAnswer(question.getAnswers().get(i))){
                    buttons[i].setBackground(getResources().getDrawable(R.drawable.question_type3_correct_answer_background));
                    callBack.onAnswerSelected(questionPosition, answerState, i, btnPos);
                }
            }
        }

    }

    private void checkIsGameOver(){
        if (isGameOver){
            btnsSetEnableOff();
        }
    }

    @Override
    public void onDataUpdate(int answersState, int correctAnswerIndex, int incorrectAnswerIndex, boolean isGameOver) {
        this.answerState = answersState;
        this.correctAnswerIndex = correctAnswerIndex;
        this.incorrectAnswerIndex = incorrectAnswerIndex;
        this.isGameOver = isGameOver;
        checkIsGameOver();
        checkAnswerState();
    }

    @Override
    public Question getQuestion() {
        return question;
    }
}

标签: javaandroidmultithreading

解决方案


推荐阅读