android:立即启动活动,然后加载内容

2022-09-01 23:29:53

我已经研究了其他问题,博客和文档,似乎找不到满足我需求的正确答案。我有两个活动,A和B。当我启动活动B(从A)时,我希望它立即打开,然后在显示进度条的同时加载所有内容,而不是仅在加载内容时打开活动,使其看起来像冻结了两秒钟。一个例子是Youtube应用程序或Play商店。

这就是我得到的:

Button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent goB = new intent(ActivityA.this, ActivityB.class);
            startActivity(goB);
        }
    });

这是我正在加载的活动:

public class ActivityB extends AppCompatActivity implements OnDateSelectedListener, OnMonthChangedListener {

    private static final DateFormat FORMATTER = SimpleDateFormat.getDateInstance();

    @Bind(R.id.calendarView) MaterialCalendarView widget;
    @Bind(R.id.textView) TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_c_calendar);
        ButterKnife.bind(this);
        widget.setOnDateChangedListener(this);
        widget.setOnMonthChangedListener(this);
        textView.setText(getSelectedDatesString());

    }

    @Override
    public void onDateSelected(@NonNull MaterialCalendarView widget, @Nullable CalendarDay date, boolean selected) {
        textView.setText(getSelectedDatesString());
    }

    private String getSelectedDatesString() {
        CalendarDay date = widget.getSelectedDate();
        if (date == null) {
            return "No Selection";
        }
        return FORMATTER.format(date.getDate());
    }

    @Override
    public void onMonthChanged(MaterialCalendarView widget, CalendarDay date) {

    }

}

我不是专家,所以欢迎详细的解释。

注意:我在活动中加载的是此日历:https://github.com/prolificinteractive/material-calendarview

问题:如何在后台加载?setContentView()

更新:我遵循了Hitesh Sahu的建议,现在我只有一个活动,每个片段都会替换一个容器,我假设在后台加载xml内容的方式对于片段和活动是相同的,但是如果有任何区别,请提及。


答案 1

可能的解决方案

  • “我不是专家”,我的猜测是你可能在每个屏幕上创建新活动切换,并且可能没有清除旧的活动或重用现有的活动。同样,这是我的猜测,我没有看到你的代码,但我看到开发人员犯了这种错误。很快,你的应用的性能将随着时间的推移而下降,你的应用最终会消耗内存。

    如何解决这个问题 :- 用片段交换片段替换活动比切换活动相对快,而且你可以重用它们(更多关于这一点)。

  • 您可能正在主Ui线程上执行一些繁重的任务,查找编舞者日志,例如 -skipped n number of frames app may be doing too much work on main thread

    如何解决这个问题:- 已经在其他答案中解释过了。


答案 2

您的活动 B 应具有用于加载数据然后显示数据的 AsyncTask。您还可以在OnPreExecute()

@Override
protected void onCreate(Bundle savedInstanceState) {
    setupViews();
}

private void setupViews(){
    someView1 = (TextView) findViewById(R.id.some_view_id1);
    someView2 = (TextView) findViewById(R.id.some_view_id2);
    someView3 = (ImageView) findViewById(R.id.some_view_id3);
    progressBar = (ProgressBar) findViewById(R.id.progress_bar_id);
    new LoadDataForActivity().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

private class LoadDataForActivity extends AsyncTask<Void, Void, Void> {

String data1;
String data2;
Bitmap data3;

    @Override
    protected void onPreExecute() {
        progressBar.setVisibility(View.VISIBLE);
    }
    @Override
    protected Void doInBackground(Void... params) {
        data1 = loadData1();
        data2 = loadData2();
        data3 = loadData3();
    }

    @Override
    protected void onPostExecute(Void result) {
        someView1.setText(data1);
        someView2.setText(data2);
        someView3.setImageBitmap(data3);
        progressBar.setVisibility(View.GONE);
    }

}

推荐