Призыв к рабочим игрокам выполнять фоновые задачи, все еще замораживает пользовательский интерфейс приложенияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Призыв к рабочим игрокам выполнять фоновые задачи, все еще замораживает пользовательский интерфейс приложения

Сообщение Anonymous »

Когда WorkManager вызывает CallbackDispatcher , приложение UI на мгновение замораживает, и любая тяжелая работа будет продолжать заморозить его. Его можно смягчить, используя Compute для тяжелых вычислений, но первоначальный вызов CallbackDispatcher всегда будет заморозить пользовательский интерфейс. Похоже, что первоначальный вызов все еще привязан к основному изоляту в отличие от вызова с вычислением.
Я пытался найти ответ на это повсюду, но не повезло. Я проверил это в примере проекта в библиотеке Workmanager , добавив CircularProgressIndicator () в верхнюю часть столбца, а также создал свой собственный маленький ниже. Я считаю, что это приводит к некоторым странным взаимодействию с Audio_Session в моем собственном приложении (хотя это просто предположение с моей стороны). < /P>
Я совершенно готов принять, что я все это неправильно устанавливаю. Если так, я бы хотел, чтобы я делал не так.import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:xml/xml.dart';
import 'package:http/http.dart' as http;
import 'package:workmanager/workmanager.dart';

void main() {
WidgetsFlutterBinding.ensureInitialized();
Workmanager().initialize(
callbackDispatcher,
);
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({super.key});

// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}

class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});

final String title;

@override
State createState() => _MyHomePageState();
}

class _MyHomePageState extends State {

@override
void initState() {
// TODO: implement initState
super.initState();
}

int _counter = 0;

void registerTask(bool useCompute) {
Workmanager().cancelAll();
Workmanager().registerOneOffTask(
'backgroundTask',
'backgroundTask',
initialDelay: const Duration(seconds: 2),
existingWorkPolicy: ExistingWorkPolicy.replace,
inputData: { 'useCompute': useCompute }
);
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () => registerTask(false),
child: Text('Task without compute'),
),
ElevatedButton(
onPressed: () => registerTask(true),
child: Text('Task with compute'),
),
CircularProgressIndicator(),
],
),
),
);
}
}

@pragma('vm:entry-point')
void callbackDispatcher() async {
Workmanager().executeTask((task, inputData) async {
final useCompute = inputData?['useCompute'] ?? false;
if(useCompute) {
compute(updateTask, inputData ?? {});
return true;
}
else {
await updateTask(inputData ?? {});
return true;//Future.value(true);
}
});
}

updateTask(Map value) async {
try{
print('Start debug task');
final url = r'https://feeds.libsyn.com/583795/rss?limit=10';
final uri = Uri.parse(url);

print('Create Response');
final request = http.Request('GET', uri)..maxRedirects = 20;
request.followRedirects = false;
final response = await http.Client().send(request);
final location = response.headers['location'];
// snapShot = log('Check feed URL', stopwatch, snapShot);

print('Http get');
//final feedContent = await http.get(uri);
final feedContent = await http.get(uri);
// snapShot = log('Feed url get', stopwatch, snapShot);
final decodedContent = Utf8Decoder().convert(feedContent.bodyBytes);
//print('No XML');

print('XML Parse');
final feedDoc = XmlDocument.parse(decodedContent);
// snapShot = log('Xml parse', stopwatch, snapShot);
final parentNode = feedDoc.findElements('rss')
.single.findElements('channel').single;

print('Get title');
final title = _getNodeValue(parentNode, 'title', 'Title Not Found');
print(title);
} catch (e) {
print(e);
}
print('End debug task');
}

String _getNodeValue(XmlElement parentNode, String nodeName, String backup) {
try {
var node = parentNode.findElements(nodeName);
if (node.isNotEmpty) {
var nodeText = node.first.innerText;
return nodeText;
} else
return backup;
} catch (_) {
return backup;
}
}
< /code>
pubspec.yaml
name: test_project
description: "A new Flutter project."
publish_to: 'none'
version: 1.0.0+1

environment:
sdk: ^3.8.1

dependencies:
flutter:
sdk: flutter

cupertino_icons: ^1.0.8
xml: ^6.5.0
http: ^1.4.0
workmanager: ^0.8.0

dev_dependencies:
flutter_test:
sdk: flutter

flutter_lints: ^5.0.0

flutter:
uses-material-design: true
< /code>
Fluter Doctor < /p>
[√] Flutter (Channel stable, 3.32.7, on Microsoft Windows [Version 10.0.26100.4652], locale en-US)
[√] Windows Version (11 Home 64-bit, 24H2, 2009)
[√] Android toolchain - develop for Android devices (Android SDK version 35.0.0)
[√] Chrome - develop for the web
[X] Visual Studio - develop Windows apps
X Visual Studio not installed; this is necessary to develop Windows apps.
Download at https://visualstudio.microsoft.com/downloads/.
Please install the "Desktop development with C++" workload, including all of its default components
[√] Android Studio (version 2024.2)
[√] VS Code (version 1.102.1)
[√] Connected device (5 available)
[√] Network resources


Подробнее здесь: https://stackoverflow.com/questions/797 ... the-app-ui
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»