2017-09-30 5 views
0

Je suis en train de faire un projet Android Xamarin, je ne veux pas afficher une liste d'objets de ma base de données SQLite dans un RecyclerView.Xamarin Android async attendre pas attendre la méthode

Le RecyclerView est dans un fragment. Je ne veux pas afficher la liste quand j'ouvre ce fragment, et quand je reviens d'une activité à ce fragment, je ne veux pas rafraîchir les données de la vue recycleur. Pour savoir je reçois les bonnes valeurs, mais je ne sais pas pourquoi le résultat GetMyObjectsAsync n'est pas attendu Pourquoi?

using System.Collections.Generic; 
using System.Threading.Tasks; 
using Android.OS; 
using Android.Support.V7.Widget; 
using Android.Views; 
using Microsoft.Practices.ServiceLocation; 
using System.Linq; 
using Android.App; 
using Android.Widget; 
using Android.Util; 
using System; 

namespace POCProject.Droid.Fragments 
{ 
    public class MyCustomFragment : Fragment 
    { 

     private IMyObjectsService _myObjectsService; 

     List<ObjModel> myObjects { get; set; } = new List<ObjModel>(); 

     RecyclerView mRecyclerView; 

     RecyclerView.LayoutManager mLayoutManager; 

     MyObjectsRecyclerViewAdapter mAdapter; 



     public override void OnCreate(Bundle savedInstanceState) 
     { 
      base.OnCreate(savedInstanceState); 

      _myObjectsService = ServiceLocator.Current.GetInstance<IMyObjectsService>(); 

     } 

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 

      View view = inflater.Inflate(Resource.Layout.fragment_my_objects_list, container, false) as View; 

      mRecyclerView = view.FindViewById<RecyclerView>(Resource.Id.MyRecyclerView); 


      mLayoutManager = new LinearLayoutManager(mRecyclerView.Context); 


      mRecyclerView.SetLayoutManager(mLayoutManager); 

      return view; 
     } 

     public override void OnResume() 
     { 
      base.OnResume(); 
      Task.Run(async() => { 
       try 
       { 
        myObjects = await GetMyObjectsAsync(); // Here it's not awaited the result why ? 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
       } 

      }); 
      mAdapter = new MyObjectsRecyclerViewAdapter(myObjects); 
      Console.WriteLine("--------------------OnResume Called-------------------- " + myObjects.Count()); // Always 0 why ? 

      mRecyclerView.SetAdapter(mAdapter); 
     } 



     private async Task<List<ObjModel>> GetMyObjectsAsync(){ 
      Console.WriteLine("--------------------GetMyObjectsAsync Called--------------------"); 
      var result = await _myObjectsService.GetAllAsync(); // Get objects in sqlite databases 
      Console.WriteLine("-------------------- result" + result.Value.Count() + "--------------------"); // Return the correct value for example 5 

      List<ObjModel> myOjectsTmp = new List<ObjModel>(); 


      if (!result.HasErrors && result.HasValue) 
      { 
       foreach (var obj in result.Value) 
       { 
        myOjectsTmp.Add(obj); 
       } 
       Console.WriteLine("-------------------- myOjectsTmp"+ myOjectsTmp.Count() + "--------------------"); // Return the correct value for example 5 
      } 

      return myOjectsTmp; 
     } 


    } 
} 
+0

Comment puis-yo tu sais que ça n'attend pas? –

+0

@NongthonbamTonthoi Parce que myObjects dans le try catch renvoie toujours 0 au lieu du résultat de la méthode GetMyObjectsAsync() qui renvoie 5, rien n'est affiché. Je le vois avec la console WriteLine aussi – fandro

+0

Appelez 'GetMyObjectsAsync()' sans aucun type de retour. et placez l'adaptateur après la boucle dans 'GetMyObjectsAsync()' –

Répondre

1

Essayez ceci:

Déplacer ces deux lignes:

mAdapter = new MyObjectsRecyclerViewAdapter(myObjects); 
mRecyclerView.SetAdapter(mAdapter); 

après

myObjects = await GetMyObjectsAsync(); 

Comme:

myObjects = await GetMyObjectsAsync(); 
Activity.RunOnUiThread(() => 
        { 
    mAdapter = new MyObjectsRecyclerViewAdapter(myObjects); 
    mRecyclerView.SetAdapter(mAdapter); 
}); 
+0

Même comportement que l'autre solution, mais j'ai ce message dans la sortie de l'application: "Seulement l'original thread qui a créé une hiérarchie de vue peut toucher ses vues. " – fandro

+0

myObjects est à la bonne valeur maintenant – fandro

+0

Cela semble fonctionner, j'ai besoin de faire plus de tests et je vais vous dire donnez-moi des minutes – fandro