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的myAsyncTask
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);