OnBindViewHolder没有找到合适的方法来覆盖使用await方法

时间:2017-12-07 00:16:02

标签: c# android xamarin

在类ContactsAdapter中我有方法OnBindViewHolder,我在其中调用await DirectToLoadImageAsync(stringURL,my_contacts_view.vImage)。 await方法使OnBindViewHolder形成:

public class ContactsAdapter: RecyclerView.Adapter, View.IOnClickListener
    {

    public override async System.Threading.Tasks.Task OnBindViewHolderAsync(RecyclerView.ViewHolder holder, int position)
    {
    ...
    await DirectToLoadImageAsync(stringURL, my_contacts_view.vImage);
    ...
    }

    private async System.Threading.Tasks.Task DirectToLoadImageAsync(string stringURL, CircleImageView vImage)
            {
                var resultImg = await LoadImageAsync(stringURL);
                vImage.SetImageBitmap(resultImg);

            }

    private System.Threading.Tasks.Task<Bitmap> LoadImageAsync(string stringURL)
            {
                return System.Threading.Tasks.Task.Factory.StartNew(() => LoadImage(stringURL)); 
            }

    private Bitmap LoadImage(string stringURL)
            {
             ...
            }
    }

如何避免错误:OnBindViewHolder找不到合适的方法来覆盖使用await方法?

1 个答案:

答案 0 :(得分:0)

  

OnBindViewHolder找不到合适的方法来覆盖使用等待方法吗?

由于返回类型不兼容,您无法在方法签名中使用async关键字,因此无法在此方法中使用await关键字,请注意您的OnBindViewHolder已重命名为OnBindViewHolderAsync }。

async方法必须返回voidTaskTask<T>,并且仅在使事件处理程序异步时才使用返回void 。对于上面提到的OnBindViewHolder方法,其返回类型为void,无法更改为返回Task,因为调用它的OS方法显然不使用await关键字等无法处理返回的Task。因此,您无法将async关键字添加到上述方法中,因此在从上述方法调用await方法时无法使用async关键字。

解决方案:

像这样修改你的代码:

public override void OnBindViewHolder (RecyclerView.ViewHolder holder, int position)
{
    ...
    Task.Run(async () => {
        try
        {
            await DirectToLoadImageAsync(stringURL, my_contacts_view.vImage);
        }
        // Catch any other exceptinons that may have occured
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    });
    ...
}