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?您不应该在按钮单击侦听器中调用它,以避免内存泄漏