【问题标题】:How to Turn My Code into Async Task?如何将我的代码变成异步任务?
【发布时间】:2014-11-02 05:13:24
【问题描述】:

我正在尝试创建一个按钮,一旦单击,该按钮将转到另一个活动 FourthActivity,但我的 Logcat 上不断收到以下错误:“Choreographer:跳过 121 帧!应用程序可能在其主服务器上做了太多工作线。”我做了一些研究,发现使用AsyncTask 可以摆脱它,但我不知道该怎么做。谁能帮我?谢谢!

下面是ThirdActivity.java的代码:

package elena.crosscountry.app;

    import android.app.Activity;
    import android.widget.Button;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.View;
    import android.content.Intent;


    public class ThirdActivity extends Activity implements View.OnClickListener {

        Button staart;

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

            staart = (Button) findViewById(R.id.staart);
            staart.setOnClickListener(this);
        }

        private void staartClick(){
            startActivity(new Intent(ThirdActivity.this, FourthActivity.class));
        }

        public void onClick(View view){
            switch(view.getId()){
                case R.id.staart:
                    staartClick();
                    break;
            }
        }


        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.third, menu);
            return true;
        }

    }

下面是activity_third.xml的代码:

<LinearLayout 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"
    tools:context=".ThirdActivity" >

    <Button
        android:id="@+id/staart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/start" />

</LinearLayout>

【问题讨论】:

  • 我在主线程上看不到任何繁重的工作,这是完整的代码吗?
  • 这可能是导致错误的另一件事。不是IntentFourthActivity.class 中有什么内容?

标签: java android


【解决方案1】:

AsyncTask 是一个类,您可以使用它来进行冗长的后台计算,并在稍后传达结果,例如:

  • 下载文件
  • 计算长数学公式

使用AsyncTask 不是您要开始的活动。如果您在启动活动时收到该消息,则可能是其构造函数中的新活动 onCreate 和 onStart 阻塞了 UI。请注意,当您开始一项活动时,会发生很多事情:

  • 新活动:Constructor -> onCreate -> onStart -> onResume
  • 旧活动:OnPause ->(可能)onStop ->(可能)onDestroy
  • 更糟糕的是,垃圾收集器经常在这些步骤之间的任何时间发挥作用,当这种情况发生时,用户界面实际上会停止一段时间(短)。您可以在 logcat 中看到类似 "GC, freed xxxxKb,stopped for 100ms"
  • 之类的内容

所有这些都是按顺序发生的,而且速度非常快。 Choreographer 是主要的 android 循环,它告诉你它在这个过程中的某个地方被阻塞并丢失了一些帧。

这也可能取决于手机/平板电脑硬件:旧硬件在停止/开始活动时很容易不堪重负。如果您可以控制新活动,只需确保它的初始化不会太繁重。

【讨论】:

  • 感谢您提供的内容丰富的回复!我对 Android Studio 很陌生,所以我不确定如何确保初始化不会太重......这是什么意思?
  • 这意味着你的activity不应该对上述方法做很多复杂的事情,特别是在activity构造函数中,onCreateonStart。这 3 个甚至在 Activity 被“绘制”之前就执行了,因此例如,如果你在一张表中填满了数千个计算,那么在 Activity 开始并绘制到屏幕之前,你会遇到很大的延迟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多