Java 类强制转换异常,来自AsyncTask的适配器内部

Java 类强制转换异常,来自AsyncTask的适配器内部,java,android,interface,Java,Android,Interface,当我试图从适配器内部使用接口和异步任务时,我得到了java.lang.ClassCastException。我不知道这是否是“允许的”,但我不明白为什么只要一切都在上下文中就不会发生 当我尝试使用自定义的适配器设置GridView时,代码从我的片段开始 mSceneGridAdapter = new SceneGridAdapter(getActivity(), mScenesList); 这导致我的SceneGridAdapter类被调用 public class SceneGridAdap

当我试图从适配器内部使用
接口
异步任务
时,我得到了
java.lang.ClassCastException
。我不知道这是否是“允许的”,但我不明白为什么只要一切都在上下文中就不会发生

当我尝试使用自定义的
适配器设置
GridView
时,代码从我的
片段开始

mSceneGridAdapter = new SceneGridAdapter(getActivity(), mScenesList);
这导致我的SceneGridAdapter类被调用

public class SceneGridAdapter extends BaseAdapter implements HandleProductThumbnail {
    private Context mContext;
    private ArrayList<Scene> mSceneList = null;
    private LayoutInflater mInflater;
    private Drawable mThumbnail;

    public SceneGridAdapter() {}

    public SceneGridAdapter(Context context, ArrayList<Scene> sceneList) {
        super();

        mContext = context;
        if (mSceneList != null) {
            clearData();
        } else {
            mSceneList = sceneList;
        }

        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.scene_cell, null);
        }

        ImageView sceneView = (ImageView) convertView.findViewById(R.id.sceneImage);

        Scene scene = mSceneList.get(position);
        String specifier = scene.getSpecifier() + "/" + scene.getName();
        LoadScenes scenes = new LoadScenes(mContext, specifier);
        scenes.execute();
        sceneView.setBackground(mThumbnail);

        return convertView;

    }

    @Override
    public int getCount() {
        return mSceneList.size();
    }

    @Override
    public Object getItem(int position) {
        return mSceneList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public void clearData() {
        mSceneList.clear();
    }

    @Override
    public void handleProductThumbnail(Drawable thumb) {
        mThumbnail = thumb;
    }
}
然后调用名为LoadScenes的my
AsyncTask
loader类,该类加载缩略图并将其返回到适配器

public class LoadScenes extends AsyncTask<Void, Void, Drawable> {
    private static final String LOADING = "Loading...";
    private static final String PNG = "_ORIGINAL.PNG";

    private Context mContext;
    private HandleProductThumbnail mHandleThumbnail = null;
    private ProgressDialog mProgressDialog;
    private String mSpecifier;

    public LoadScenes () {}

    public LoadScenes (Context context, String specifier) {
        mContext = context;
        mSpecifier = specifier;
    }

    @Override
    public void onPreExecute() {
        mProgressDialog = new ProgressDialog(mContext);
        mProgressDialog.setMessage(LOADING);
        mProgressDialog.show();
    }

    public Drawable doInBackground(Void... v) {
        Drawable productThumbnail = getDrawable(mSpecifier);
        return productThumbnail;
    }

    public void onPostExecute(Drawable productThumbnail) {
        mProgressDialog.dismiss();
        mHandleThumbnail = (HandleProductThumbnail) mContext;
        mHandleThumbnail.handleProductThumbnail(productThumbnail);
    }

    public Drawable getDrawable(String specifier) {
        Bitmap bmp = null;
        Drawable productThumbnail = null;
        specifier = specifier.replace("\\", "/") + PNG;
        try {
            bmp = BitmapFactory.decodeStream(mContext.getAssets().open(specifier));
            if (bmp != null) {
                int width = 300;
                int height = 240;
                bmp = Bitmap.createScaledBitmap(bmp, width, height, true);
                productThumbnail = new BitmapDrawable(mContext.getResources(), bmp);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return productThumbnail;
    }
}

片段
附加到名为VisualizationActivity的
活动
,传递的所有上下文都来自该
活动
。虽然这个问题有点分层,但代码相当简单。我想知道我是否只是做了一些不被允许的事情?根据我对
上下文的理解
这应该是可行的。请让我知道我做错了什么,为什么,以及是否可以修复。谢谢

看起来您的活动不是在实现
HandleProductThumbnail
,而是在实现您的自定义适配器。在您的情况下,我宁愿向
AsyncTask
子类添加一个方法,而不是强制转换:

   public void setHandleProductThumbnail(HandleProductThumbnail listener) {
           mHandleThumbnail = listener;
   }
和内部
OnPostExecute

 public void onPostExecute(Drawable productThumbnail) {
    mProgressDialog.dismiss();
    if (mHandleThumbnail != null)
       mHandleThumbnail.handleProductThumbnail(productThumbnail);
}
你的问题是:

mHandleThumbnail = (HandleProductThumbnail) mContext;
您正在将
mContext
转换为
HandleProductThumbnail
,而
mContext
是一个
上下文
,因此没有实现自定义界面。如果需要对
HandleProductThumbnail
的引用,请将其作为构造函数参数传递


最后一点注意:如果您试图在每个列表项上加载缩略图,我建议使用,这将使您的操作更加简单。

很明显,它将创建一个类强制转换异常, 因为mContext是活动的对象,它没有实现“HandleProductThumbnail”接口

虽然您通过正确的强制转换来纠正代码,但由于适配器中的以下代码行,它将产生错误

    LoadScenes scenes = new LoadScenes(mContext, specifier);
    scenes.execute();
    sceneView.setBackground(mThumbnail);

因为第二行是异步调用,mThumbnail将为null。您可以在运行时应用另一种方法从URL呈现图像。

没错,我的活动没有实现我的接口。我的适配器是。我的适配器在设置GridView之前执行此操作。如果我将Drawable返回到我的活动中,我将如何将其传递回适配器?您看到问题了吗?您没有将drawable返回到活动,而是返回到适配器。特别是你将结果返回给类,实现接口这对我来说很有意义,谢谢你的毕加索建议。
mHandleThumbnail = (HandleProductThumbnail) mContext;
    LoadScenes scenes = new LoadScenes(mContext, specifier);
    scenes.execute();
    sceneView.setBackground(mThumbnail);