How can I run something Async in OncreateView?

Viewed 1832

I have a problem with my app. Firstly, I made two Tabs using fragments which inflates an activity. The tabs implemented is working fine. Secondly i have displayed the XAML right.

However, I now need to run something asynchronously in OnCreateView in the Fragment. How can i manage this without getting errors?

Any help is greatly appreciated! Thanks

Here is my Fragment:

public class FragmentSettings : SupportFragment
{
    private Button mBtnOk;

    public FragmentSettings(Context context)
    {
        mContext = context;
    }

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

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        //Inflate the fragment XML
        View view = inflater.Inflate(Resource.Layout.FragmentSettings, container, false);

        //Grab the butten from the inflated fragment
        mBtnOk = view.FindViewById<Button>(Resource.Id.mBtnOk);
        mBtnOk.Click += (object sender, EventArgs e) =>
        {
            //DO stuff
        };
        //=====================================
        //Want to do something async stuff here
        //=====================================

        return view;
    }
}
3 Answers

This did the trick for me, thanks for all the answers!

    public override async void OnActivityCreated(Bundle savedInstanceState)
    {
        base.OnActivityCreated(savedInstanceState);


        await LoadData();
    }
    private async Task LoadData()
    {
     //My async method 
    }

For example you can simply run

AsyncTask

Just put there something like this:

 new AsyncTask<Void, Void, Void>() {
     @Override
     protected Void doInBackground(Void... voids) {
         //do your work here
         return null;
     }
 }.execute();

I would just use a Backgroundworker, if you need stuff done in the background:

BackgroundWorker bworker;

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    //Inflate the fragment XML
    View view = inflater.Inflate(Resource.Layout.FragmentSettings, container, false);

    //Grab the butten from the inflated fragment
    mBtnOk = view.FindViewById<Button>(Resource.Id.mBtnOk);
    mBtnOk.Click += (object sender, EventArgs e) =>
    {
        //DO stuff
    };

    //Start background task
    bworker = new BackgroundWorker();
    bworker.DoWork += Bworker_DoWork;
    bworker.RunWorkerCompleted += Bworker_RunWorkerCompleted;
    bworker.RunWorkerAsync();

    return view;
}


private void Bworker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{   
   //Do stuff when the operation is completed
    bworker.RunWorkerAsync();
}

private void Bworker_DoWork(object sender, DoWorkEventArgs e)
{
    //Do the work in the background
}

EDIT: To make it run continuously, you can start the backgroundworker agin in the Bworker_RunWorkerCompleted method. (see the method)

I just dont think it is a good way implement a continuous thread, since i got the feeling it will take up alot of memory. You can try though.

Related