Thread Safety for Event Dispatcher broadcasting using AsyncTask

WeakPtr was not the solution you were right the events inside bp all become Unbound after sometime

UCLASS()
class ANDROIDFILESYSTEM_API UAndroidFileSystemBlueprint : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
public:
	UAndroidFileSystemBlueprint (const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) {};

private:
    static UCallback* DelegateObj;
};

Theses are the java callback functions

#if PLATFORM_ANDROID
JNI_METHOD void Java_com_epicgames_unreal_GameActivity_OnFilePickerResult(JNIEnv* env, jclass clazz, jobjectArray result)
{
    TArray<FString> Result = JavaConvert::ConvertToStringArray(result);
	
    TArray<FString>* ResultPathPtr = new TArray<FString>(Result);
    
    AsyncTask(ENamedThreads::GameThread, [ResultPathPtr] () 
	{
		TWeakObjectPtr<UCallback> WeakCallback = DelegateObj;
		
		if (WeakCallback.IsValid())
		{
			UCallback* CallbackObj = WeakCallback.Get();

			if (IsValid(CallbackObj))
			{
				if (CallbackObj->GetFilePickerResultDelegate().IsBound())
				{
					CallbackObj->GetFilePickerResultDelegate().Broadcast(ResultPathPtr);
				}
			}
	}
		delete ResultPathPtr;
	});
}
#endif

This is the class that has all delegates

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOneParamDelegate, const TArray<FString>, Path);

UCLASS(BlueprintType)
class ANDROIDFILESYSTEM_API UCallback : public UObject
{
	GENERATED_BODY()

public:

	UFUNCTION() FORCEINLINE
	FOneParamDelegate& GetFilePickerResultDelegate() { return this->OnFilePickerResult; }

private:

    UPROPERTY(BlueprintAssignable)
	FOneParamDelegate OnFilePickerResult;

};