如何在OncreateView中异步运行某些内容?

3

我有一个关于我的应用程序的问题。首先,我使用片段创建了两个选项卡,这些选项卡会充气一个活动。这些实现的选项卡工作正常。其次,我已经正确显示了XAML

但是,现在我需要在片段的OnCreateView中异步运行一些内容。如何在不出错的情况下管理它?

非常感谢任何帮助!谢谢

这是我的片段:

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;
    }
}

有没有特别的原因需要使用异步方法,你在异步方法中想要做什么? - Troels Thisted
我想从我的数据库中显示一些内容,这需要与其他部分分开运行。 - Cvassend
需要持续运行还是只需要运行一次? - Troels Thisted
它必须持续运行。 - Cvassend
3个回答

7

这对我很有帮助,感谢所有的回答!

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


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

1
太棒了!完全忘记了这个循环!谢谢! - Xonshiz

0
例如,您可以简单地运行:

AsyncTask

只需像这样放置即可:
 new AsyncTask<Void, Void, Void>() {
     @Override
     protected Void doInBackground(Void... voids) {
         //do your work here
         return null;
     }
 }.execute();

2
我个人会将异步任务从OnCreate()方法中分离出来。 - MwBakker
1
你说得对。最好的方法是在OnCreateView中实现仅负责设置视图属性的代码。 - Patryk Jabłoński

-1
我会使用Backgroundworker,如果你需要在后台完成一些任务:
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
}

编辑:为了使其持续运行,您可以在Bworker_RunWorkerCompleted方法中再次启动backgroundworker。(请参见该方法)

我只是觉得这不是一种好的实现持续线程的方式,因为我有一种感觉它会占用很多内存。您可以尝试一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接