我写了一个代码来从互联网上下载图像。我必须在动态创建的ImageView
中显示它。
我收到的错误是只有创建视图层次结构的原始线程才能触及其视图。我知道我必须写一个句柄,但我该怎么做?
这是我的代码:
public class ResimCek implements Runnable {
int resimID = 0;
public ResimCek(int parcaID) {
// store parameter for later user
resimID = parcaID;
}
public void run() {
int resID = getResources().getIdentifier(Integer.toString(resimID) , "tag", getPackageName());
ImageView resim = (ImageView) findViewById(resID);
Drawable image = ImageOperations(getBaseContext(),"http://141.11.11.206/parca/" + Integer.toString(resimID) + ".jpg" ,"I" + Integer.toString(resimID) + ".jpg");
// I AM GETTING ERROR HERE ******************
resim.setImageDrawable(image); // *************************
}
}
private Drawable ImageOperations(Context ctx, String url, String saveFilename) {
try {
InputStream is = (InputStream) this.fetch(url);
Drawable d = Drawable.createFromStream(new URL(url).openConnection().getInputStream(),saveFilename);
return d;
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public Object fetch(String address) throws MalformedURLException,IOException {
URL url = new URL(address);
Object content = url.getContent();
return content;
}
private void MalzemeEkle(String malzemeKodu, String malzemeTanimi) {
ImageView parcaresmi = new ImageView(this);
parcaresmi.setId(Integer.parseInt(malzemeKodu));
Runnable r = new ResimCek(Integer.parseInt(malzemeKodu));
new Thread(r).start();
}
答案 0 :(得分:2)
public class ResimCek implements Runnable {
int resimID = 0;
public ResimCek(int parcaID) {
// store parameter for later user
resimID = parcaID;
}
public void run() {
int resID = getResources().getIdentifier(Integer.toString(resimID) , "tag", getPackageName());
ImageView resim = (ImageView) findViewById(resID);
Drawable image = ImageOperations(getBaseContext(),"http://141.11.11.206/parca/" + Integer.toString(resimID) + ".jpg" ,"I" + Integer.toString(resimID) + ".jpg");
// I AM GETTING ERROR HERE ******************
resim.setImageDrawable(image); // *************************
}
}
new Handler().post(new ResimCek(Integer.parseInt(malzemeKodu))); instead of new Thread(r).start();
无论如何,如果这是一个活动..那么
runOnUIThread(new ResimCek(Integer.parseInt(malzemeKodu))); `instead of new Thread(r).start();`
也会有效..
答案 1 :(得分:1)
您应该创建一个处理程序:
final Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg)
{
/*do all your ui action here to display the image ()*/
resim.setImageDrawable(image);
}
};
在下载图像时你的runnable中调用:
myHandler.sendEmptyMessage(0);
您可以在此处找到处理程序的其他选项 http://developer.android.com/reference/android/os/Handler.html