Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用AsynTask类处理仍在获取的服务;跳过31帧!应用程序可能在其主线程上做了太多工作。”;。为什么?_Java_Android_Android Studio_Service_Android Asynctask - Fatal编程技术网

Java 使用AsynTask类处理仍在获取的服务;跳过31帧!应用程序可能在其主线程上做了太多工作。”;。为什么?

Java 使用AsynTask类处理仍在获取的服务;跳过31帧!应用程序可能在其主线程上做了太多工作。”;。为什么?,java,android,android-studio,service,android-asynctask,Java,Android,Android Studio,Service,Android Asynctask,我刚刚创建了简单的服务,只需点击按钮,就可以在AsynTask类中启动服务,但在logcati/Choreographer上得到消息:跳过了31帧!应用程序可能在其主线程上做了太多工作。为什么? 这是我的密码 MainActivity.java package com.example.servicesandroidtutu; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; im

我刚刚创建了简单的服务,只需点击按钮,就可以在
AsynTask
类中启动服务,但在logcati/Choreographer上得到消息:跳过了31帧!应用程序可能在其主线程上做了太多工作。为什么?

这是我的密码

MainActivity.java

package com.example.servicesandroidtutu;
import androidx.appcompat.app.AppCompatActivity;    
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private MyAsynTask myAsynTask;
    private Button start, stop;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        start = findViewById(R.id.button);
        stop = findViewById(R.id.button2);

        myAsynTask = new MyAsynTask();

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myAsynTask.execute();
            }
        });

        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myAsynTask.cancel(true);
            }
        });

    }

    class MyAsynTask extends AsyncTask<Void,  Void, Void>{

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            startService(new Intent(getApplicationContext(), MyService.class));
        }

        @Override
        protected Void doInBackground(Void... voids) {

            return null;
        }

        @Override
        protected void onCancelled(Void aVoid) {
            super.onCancelled(aVoid);
            stopService(new Intent(getApplicationContext(), MyService.class));
        }
    }

}
   package com.example.servicesandroidtutu;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

import androidx.annotation.Nullable;

public class MyService extends Service {


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("Service", "stopped...");

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.d("Service", "started...");

        return super.onStartCommand(intent, flags, startId);
    }
}

您的代码正在进行繁重的处理,处理需要时间,因此会出现跳过的31帧。你的服务是什么?不要在主螺纹上执行任何垂荡操作。 有关更多详细信息,请查看

另外,我建议您不要使用AsyncTask,因为它自API 30以来就被弃用了


谷歌正式推荐使用Kotlin协程或java线程。

这是否回答了您的问题。如果不是添加(正确格式化)stacktrace的问题,则无法以这种方式取消asynctask,因为在您尝试这样做时,asynctask早已完成。所以你也不能停止服务。在我的服务中,我只是记录消息。我也使用了Thread,但sameI也注意到,当您的活动正在销毁时,您并没有取消onDestroy()中的AsyncTask@重写受保护的void onDestroy(){if(myAsynTask!=null){myAsynTask.cancel(true);}super.onDestroy();}相反,我使用了onCancelled(),它将在何时调用onCancelled时销毁asyntask和StopServices?您不应该在按钮单击侦听器中调用它,以避免内存泄漏