java - Activity 需要很长时间才能加载
问题描述
我的活动只包含 ViewPager。我生成问题并将它们插入到片段中。我的 ViewPager 包含 30 个元素。我有一个启动 Activity 的菜单,当我第一次启动 Activity 时,它平均启动 3 秒,然后更快。我在开发人员控制台中收到 ANR Input dispatching timed out。我决定以编程方式跟踪onCreate()
和onWindowFocusChanged()
调用之间的时间。
- 2021-11-12 09:08:39.190/标签:ONCREATE
- 2021-11-12 09:08:39.369/标签:ONRESUME
- 2021-11-12 09:08:41.301/TAG: onWindowFocusChanged
我认为问题在于为 ViewPager 创建片段。我决定使用后台线程为其创建片段。
@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;
}
}
解决方案
推荐阅读
- javascript - 我们如何使用 NodeJs 编写 shell 脚本
- consul - 从 Consul kv 向 nomad 传递值
- ios - 如何在 Swift 中计算两个日期的天数 [相同日期应计为“I”天]
- git - 无法将代码推送到 gerrit git 存储库
- r - 从时间戳数据中提取日期和时间
- html - 我对第 n 个孩子有一些问题
- xcode - xcrun 通过 NSTask:如何以与终端相同的形式获取返回值?
- laravel - 与 RESTful 相比,GraphQL GET 响应时间很慢
- angular - 如何以角度递归执行HTTP请求?
- c++ - 如何在我的项目中间接使用具有两个不同版本的共享库?