Android通用图像加载程序不工作
我想从url加载照片并保存在Android应用程序的外部存储中,但在运行应用程序时遇到了NetworkOnMainThreadException问题。我正在尝试使用通用图像加载程序加载图像并存储到外部存储目录。谢谢 这是我的密码Android通用图像加载程序不工作,android,Android,我想从url加载照片并保存在Android应用程序的外部存储中,但在运行应用程序时遇到了NetworkOnMainThreadException问题。我正在尝试使用通用图像加载程序加载图像并存储到外部存储目录。谢谢 这是我的密码 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.all_po
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.all_post);
dbhelper = new MyDbHelper(this);
dbhelper.onOpen(db);
imageLoader = ImageLoader.getInstance();
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(CustomActionActivity.this));
options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
Loaddata();
new LosdImages().execute();
}
private class LosdImages extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
Loaddata();
return null;
}
}
public void Loaddata() {
db = dbhelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select * from ActivityObjectList", null);
if (cursor.moveToFirst())
{
do {
imageName = cursor.getString(cursor.getColumnIndex("imageaudioPath"));
Log.e("imageName "," = "+imageName);
String fileUrl = namespace + "/DownloadFile/FilePathMobile/ATTACHMENT/FileName/"+imageName;
download_PngFileImgLoader(fileUrl, imageName);
Log.e("imageName ", " DownLoaded Succecively !!! = " + imageName);
pics.add(imageName);
}
while (cursor.moveToNext());
}
cursor.close();
}
void download_PngFileImgLoader(String fileUrl, String ImageName) {
newFolder = new File(Environment.getExternalStorageDirectory().getPath() + File.separator + "classnkk_images");
File fileForImage = new File(newFolder, ImageName);
try {
InputStream sourceStream;
File cachedImage = imageLoader.getInstance().getDiscCache().get(fileUrl);
if (cachedImage != null && cachedImage.exists()) { // if image was cached by UIL
sourceStream = new FileInputStream(cachedImage);
} else { // otherwise - download image
ImageDownloader downloader = new BaseImageDownloader(getApplicationContext());
sourceStream = downloader.getStream(fileUrl, null);
}
if (sourceStream != null) {
try {
OutputStream targetStream = new FileOutputStream(fileForImage);
try {
IoUtils.copyStream(sourceStream, targetStream, null);
} finally {
targetStream.close();
}
} finally {
sourceStream.close();
}
}
} catch (IOException ie) {
ie.printStackTrace();
}
}
}
我的建议是使用
Glide
它们有缓存、错误处理等功能
简单易用
File b = new File(Environment.getExternalStorageDirectory(),
"DCIM/Camera/IMG_20151028_192555.jpg");
Glide.with(MainActivity.this).load(c).
error(R.drawable.empty_pic).
placeholder(R.drawable.empty_pic).into(image2);
看到这个我给你的建议是使用
Glide
它们有缓存、错误处理等功能
简单易用
File b = new File(Environment.getExternalStorageDirectory(),
"DCIM/Camera/IMG_20151028_192555.jpg");
Glide.with(MainActivity.this).load(c).
error(R.drawable.empty_pic).
placeholder(R.drawable.empty_pic).into(image2);
参见此您必须在
异步任务
中编写网络操作,而不是在主线程
删除此行表单onCreate()
方法,您已经在异步任务中调用了该方法
Loaddata();
您必须在AsyncTask
中编写网络操作,而不是在MainThread
删除此行表单onCreate()
方法,您已经在异步任务中调用了该方法
Loaddata();
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局,所有帖子);
dbhelper=新的MyDbHelper(此);
dbhelper.onOpen(db);
imageLoader=imageLoader.getInstance();
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(CustomActionActivity.this));
选项=新建DisplayImageOptions.Builder()
.cacheInMemory(真)
.cacheOnDisk(真)
.considerExifParams(真)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
新的LosdImages().execute();
}
私有类LosdImages扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…arg0){
Loaddata();
返回null;
}
公共void Loaddata(){
db=dbhelper.getWritableDatabase();
Cursor Cursor=db.rawQuery(“从ActivityObjectList中选择*”,null);
if(cursor.moveToFirst())
{
做{
imageName=cursor.getString(cursor.getColumnIndex(“imageaudioPath”);
Log.e(“imageName”,即“=”+imageName);
字符串fileUrl=namespace+“/DownloadFile/FilePathMobile/ATTACHMENT/FileName/”+imageName;
下载\u PngFileImgLoader(文件URL、图像名称);
Log.e(“imageName”,“已成功下载!!!=”+imageName);
添加图片(图片名称);
}
while(cursor.moveToNext());
}
cursor.close();
}
无效下载\u PngFileImgLoader(字符串文件URL、字符串图像名称){
newFolder=新文件(Environment.getExternalStorageDirectory().getPath()+File.separator+“classnkk_images”);
File fileForImage=新文件(newFolder,ImageName);
试一试{
输入流源流;
文件cachedImage=imageLoader.getInstance().getDiscCache().get(fileUrl);
if(cachedImage!=null&&cachedImage.exists()){//if图像由UIL缓存
sourceStream=新文件输入流(cachedImage);
}else{//else-下载图像
ImageDownloader downloader=新的BaseMageDownloader(getApplicationContext());
sourceStream=downloader.getStream(fileUrl,null);
}
if(sourceStream!=null){
试一试{
OutputStream targetStream=新文件OutputStream(fileForImage);
试一试{
copyStream(sourceStream,targetStream,null);
}最后{
targetStream.close();
}
}最后{
sourceStream.close();
}
}
}捕获(IOIE){
即printStackTrace();
}
}
}
}
我在您的代码中做了一些更改,这导致了NetworkMainThreadException。希望它能在创建时起作用protectedvoid(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局,所有帖子);
dbhelper=新的MyDbHelper(此);
dbhelper.onOpen(db);
imageLoader=imageLoader.getInstance();
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(CustomActionActivity.this));
选项=新建DisplayImageOptions.Builder()
.cacheInMemory(真)
.cacheOnDisk(真)
.considerExifParams(真)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
新的LosdImages().execute();
}
私有类LosdImages扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…arg0){
Loaddata();
返回null;
}
公共void Loaddata(){
db=dbhelper.getWritableDatabase();
Cursor Cursor=db.rawQuery(“从ActivityObjectList中选择*”,null);
if(cursor.moveToFirst())
{
做{
imageName=cursor.getString(cursor.getColumnIndex(“imageaudioPath”);
Log.e(“imageName”,即“=”+imageName);
字符串fileUrl=namespace+“/DownloadFile/FilePathMobile/ATTACHMENT/FileName/”+imageName;
下载\u PngFileImgLoader(文件URL、图像名称);
Log.e(“imageName”,“已成功下载!!!=”+imageName);
添加图片(图片名称);
}
while(cursor.moveToNext());
}
cursor.close();
}
无效下载\u PngFileImgLoader(字符串文件URL、字符串图像名称){
newFolder=新文件(Environment.getExternalStorageDirectory().getPath()+File.separator+“classnkk_images”);
File fileForImage=新文件(newFolder,ImageName);
试一试{
输入流源流;
文件cachedImage=imageLoader.getInstance().getDiscCache().get(fileUrl);
if(cachedImage!=null&&cachedImage.exists()){//if图像由UIL缓存
sourceStream=新文件输入流(cachedImage);
}else{//else-下载图像
ImageDownloader downloader=新的BaseMageDownloader(getApplicationContext());
sourceStream=downloader.getStream(
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.all_post);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
.....
}