我在分析firebase日志(crashalytics)时注意到一个与下面发布的函数相关的特定错误。
jdk.internal.misc.Unsafe.park
主线程等待时间过长触发ANR
public class SendBackupData extends Service {
private ScheduledExecutorService executorService;
private static final WriteInLogFile wil = new WriteInLogFile();
@Override
public void onCreate() {
super.onCreate();
executorService = Executors.newSingleThreadScheduledExecutor();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
executeOperation();
executorService.scheduleAtFixedRate(this::executeOperation, 0, 50, TimeUnit.MINUTES);
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
executorService.shutdown();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void executeOperation() {
Context context = getApplicationContext();
try {
SemaphoreBKP.getInstance(context).goIn();
if (new Utilities(context).checkConnection()) {
File dataDir = new File(new Constants(context).getArchiveFolder(false));
File[] listOfFiles = dataDir.listFiles((dir, name) -> name.startsWith("REPORT") && name.endsWith(".zip"));
if (listOfFiles != null) {
for (File listOfFile : listOfFiles) {
new FilesUtilities().splitBackupFiles(context, listOfFile.getName(), "arc");
}
}
File[] listOfFragments = dataDir.listFiles((dir, name) -> {
Pattern rexExp = Pattern.compile("(?:REPORT|\\G)(-[0-9]{2}-[0-9]{2}-[0-9]{4}-[a-zA-Z0-9]{8})(\\.zip)\\.[0-9]{3,6}\\.[0-9]{3,6}");
return name.startsWith("REPORT") && rexExp.matcher(name).matches();
});
if (listOfFragments != null) {
if (listOfFragments.length > 0) {
Arrays.sort(listOfFragments);
for (File currentFragment : listOfFragments) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("filename", currentFragment.getName());
SendDataProcedure sendDataProcedure = new SendDataProcedure("1", "transmitBackupDevice", jsonObject.toString(), context);
boolean requestStatus = sendDataProcedure.postDataFromBackupPushDTS(currentFragment.getName().trim(), false);
if (requestStatus) {
if(currentFragment.exists()) {
currentFragment.delete();
}
}
}
}
}
}
} catch (Exception e) {
wil.WriteFile("SendBackupData - Exception: " + e.getMessage(), context);
} finally {
SemaphoreBKP.getInstance(context).goOut();
}
} }
字符串
我想这个问题与我在主线程中执行非常“繁重”的操作有关,因此用户的UI被阻塞。
我该如何解决这个问题?
我需要在后台运行这段代码,每隔50分钟,这个操作的时间可能会长一些,也没有办法提前知道
1条答案
按热度按时间vmdwslir1#
SemaphoreBKP goIn阻塞UI线程,将相关代码移动到另一个线程,使用AsyncTask等。