fluttercommunity / flutter_workmanager

A Flutter plugin which allows you to execute code in the background on Android and iOS.
851 stars 265 forks source link

Work Manager Thread crashes when API is called from Http or Dio #563

Open Deepakraj2022 opened 3 months ago

Deepakraj2022 commented 3 months ago

Hi I am developing an app which should fetch and upload data using Dio. When I use Dio.Get() or Dio.Push(), workmanager thread is closed abruptly. I tried to catch the exception but I am unable catch any exception. I am adding code below

AndroidManifest


<receiver
    android:name="be.tramckrijte.workmanager.BackgroundWorker"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.REBOOT" />
        <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
         <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

<service
            android:name="id.flutter.flutter_background_service.BackgroundService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="true"
            android:foregroundServiceType="dataSync">
  </service>

main.dart

void main() async {
.....
  Workmanager().initialize( _callbackDispatcher_,
      isInDebugMode: true 
      );
....
}

void callbackDispatcher() {

 try {
    Workmanager().executeTask((task, inputData) async {
      switch (task) {
        case 'simpleTask':
          print('Simple Task executed');
          break;
        case 'uploadJob':
          await  WorkManagerJob().GetExportSetting(inputData);
          break;
        // Handle other tasks
      }
      return Future.value(true);
    });
  } catch (exce) {
    print(exce);
  }
}

WorkManagerJob.Dart

GetExportSetting(Map<String, dynamic>? data)
{
 int inspectionKey = data!['inspectionKey'];
    Global.currentLogin = LoginModel();
    Global.currentLogin!.token = data['token'];
    Global.currentLogin!.account = data['account'];
    Global.currentLogin!.server = data['server'];

final url = Uri.parse(Global.apiUrl + "api/GetExportSettings");
    try {
      final response = await http.get(
        url,
        headers: <String, String>{
          'Content-Type': 'application/json; charset=UTF-8',
          '"Access-Control-Allow-Origin"': "*",
          'x-functions-key': Global.functionKey,
          'AccountAlias': Global.currentLogin!.account!,
          'token': Global.currentLogin!.token!,
        },
      );

      if (response.statusCode == 200) {
        final jsonResponse = jsonDecode(response.body);
      } else {}
    } catch (e) {
      print(e.toString());
    }
}
yahu1031 commented 1 week ago

Can you try running this verbose mode and share the app-package logs. @Deepakraj2022