Android 在异步任务中动态显示图像按钮
因此,我从Parse中检索图像并在ScrollView LinearLayout中动态显示它们,但我似乎无法添加clickListener或将它们添加到视图中。以下是我所拥有的:Android 在异步任务中动态显示图像按钮,android,dynamic,android-asynctask,android-view,Android,Dynamic,Android Asynctask,Android View,因此,我从Parse中检索图像并在ScrollView LinearLayout中动态显示它们,但我似乎无法添加clickListener或将它们添加到视图中。以下是我所拥有的: MyTaskParams params = new MyTaskParams(drinkList.get(j).getString("Name"), data, lPos, drinkList.get(j).getObjectId(), j); MyTask myTask
MyTaskParams params = new MyTaskParams(drinkList.get(j).getString("Name"), data, lPos, drinkList.get(j).getObjectId(), j);
MyTask myTask = new MyTask();
myTask.execute(params);
然后在中,我传递所有数据并尝试将ImageButton添加到视图中
private static class MyTaskParams {
String name;
byte[] data;
int lPos;
String id;
int j;
public MyTaskParams(String name, byte[] data, int lPos, String id, int j) {
this.data = data;
this.name = name;
this.lPos = lPos;
this.id = id;
this.j = j;
}
}
private class MyTask extends AsyncTask<MyTaskParams, Void, MyTaskParams> {
@Override
protected MyTaskParams doInBackground(MyTaskParams... params) {
String name = params[0].name;
byte[] data = params[0].data;
int lPos = params[0].lPos;
String id = params[0].id;
int j = params[0].j;
Log.d("DOINBACKGROUND", data.toString());
bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
btn = new ImageButton(getActivity());
btn.setId(j);
btn.setTag(name);
btn.setImageBitmap(bmp);
btn.setBackgroundDrawable(null);
btn.setMaxHeight(100);
btn.setMaxWidth(100);
btn.setOnClickListener(new DrinkButtonListener(getActivity(), lPos, id));
lLayout[lPos].addView(btn);
return null;
}
}
私有静态类MyTaskParams{
字符串名;
字节[]数据;
int LPO;
字符串id;
int j;
公共MyTaskParams(字符串名称,字节[]数据,整数LPO,字符串id,整数j){
这个数据=数据;
this.name=名称;
这是lPos=lPos;
this.id=id;
这个。j=j;
}
}
私有类MyTask扩展了AsyncTask{
@凌驾
受保护的MyTaskParams doInBackground(MyTaskParams…params){
字符串名称=参数[0]。名称;
字节[]数据=参数[0]。数据;
int lPos=params[0].lPos;
字符串id=params[0]。id;
int j=params[0].j;
Log.d(“DOINBACKGROUND”,data.toString());
bmp=位图工厂.decodeByteArray(数据,0,数据.length);
btn=新建图像按钮(getActivity());
btn.setId(j);
btn.setTag(名称);
btn.setImageBitmap(bmp);
btn.可设置为空(空);
btn.设置最大高度(100);
btn.setMaxWidth(100);
setOnClickListener(新的DrinkButtoListener(getActivity(),lPos,id));
lLayout[lPos].addView(btn);
返回null;
}
}
为什么我不能创建ClickListener或将按钮添加到视图中?
我得到一个错误:
“只有创建视图层次结构的原始线程才能触摸其视图”Y您不能触摸主线程所在的其他线程中的视图 如果要操纵视图,可以将runnable发布到如下视图中
myView.post(new Runnable(...));
一旦进入doInBackground(),就不再处于UI线程中。在史前的过去,您可以尝试从后台更新UI,但这不是一件好事 这是一件非常不好的事情,他们改变了Android,如果你尝试的话就会抛出一个错误 您可以使用特定的方法来解决这个问题。看 了解更多信息 我倾向于认为有更强大的方法来做你正在做的事情,但它们更复杂。不过,你已经有了基本的想法。你应该在培训班上花很长时间
,这可能会给您带来更多的想法。您可以通过在中实现onProgressUpdate或onPostExecute方法来更新UI 在您的情况下,可能需要使用onPostExecute
private class MyTask extends AsyncTask<MyTaskParams, Void, Bitmap> {
@Override
protected MyTaskParams doInBackground(MyTaskParams... params) {
String name = params[0].name;
byte[] data = params[0].data;
int lPos = params[0].lPos;
String id = params[0].id;
int j = params[0].j;
Log.d("DOINBACKGROUND", data.toString());
return BitmapFactory.decodeByteArray(data, 0, data.length);
}
@Override
protected void onPostExecute(Bitmap bmp) {
btn = new ImageButton(getActivity());
btn.setId(j);
btn.setTag(name);
btn.setImageBitmap(bmp);
btn.setBackgroundDrawable(null);
btn.setMaxHeight(100);
btn.setMaxWidth(100);
btn.setOnClickListener(new DrinkButtonListener(getActivity(), lPos, id));
lLayout[lPos].addView(btn);
}
}
私有类MyTask扩展了AsyncTask{
@凌驾
受保护的MyTaskParams doInBackground(MyTaskParams…params){
字符串名称=参数[0]。名称;
字节[]数据=参数[0]。数据;
int lPos=params[0].lPos;
字符串id=params[0]。id;
int j=params[0].j;
Log.d(“DOINBACKGROUND”,data.toString());
返回BitmapFactory.decodeByteArray(数据,0,数据.长度);
}
@凌驾
受保护的void onPostExecute(位图bmp){
btn=新建图像按钮(getActivity());
btn.setId(j);
btn.setTag(名称);
btn.setImageBitmap(bmp);
btn.可设置为空(空);
btn.设置最大高度(100);
btn.setMaxWidth(100);
setOnClickListener(新的DrinkButtoListener(getActivity(),lPos,id));
lLayout[lPos].addView(btn);
}
}
您可以将以下代码用于Log.e并在按钮上设置值
这是代码
yourclassname.this.runOnUiThread (new Runnable(){
public void run() {
NameUser.setText(name);
Id.setText(email);
cimg.setImageBitmap(btmp);
add1.setText(address1);
add2.setText(address2);
City.setText(city);
State.setText(state);
Pincode.setText(pincode);
Country.setText(country);
Mobile.setText(mobile);
Skills.setText(skills);
}
});
在这种情况下,为什么要使用AsyncTask对象?因为我一直收到“memoryoutofbounds”错误,我认为这不会以这种方式消失。。。