============ Problem Description ============
Who is the great God to help me see the following code, why the incoming URL finally get the drawable is empty?
Network images are downloaded to the local cache directory and saved to the Imagurl image file name. If a file with the same name is loaded locally from the cache directory Public static drawable loadimagefromurl (context context, string imageurl) {Drawable drawable = null;if (imageurl == null) return Null string imagepath = ""; string filename = "";// gets the filename and suffix of the picture in the URL if (imageurl != null && imageurl.length () != 0) {filename = imageurl.substring (ImageUrl.lastIndexOf ("/") ) + 1);} picture on the phone local storage path, note: filename is empty case imagepath = context.getcachedir () + "/" + FileName; LOG.I (tag, "imagepath = " + imagepath); File file = new file (Context.getcachedir (), filename);// save File System.out.println ( "cachedir = " + context.getcachedir ()); LOG.I (tag, "file.tostring () =" + file.tostring ());if (!file.exists () && ! File.isdirectory ()) {try {// can be used here by the filename to determine whether there is a local image fileoutputstream fos = new fileoutputstream (file); Inputstream is = new url (IMAGEURL). OpenStream (); int data = is.read ();while (data != -1) {fos.write (data);d ata = is.read (); Fos.close (); Is.close ();// drawable = drawable.createfromstream (// new url (IMAGEURL). OpenStream (), file.tostring () ); //// (InputStream) new url (IMAGEURL). getContent ();d Rawable = drawable.createfrompath (file.tostring ()); LOG.I (tag, "file.exists () no file exists, download online:" + drawable.tostring ());} catch (ioexception e) {log.e (tag, e.tostring () + "image download and save when there is an exception! ");}} else {drawable = drawable.createfrompath (File.tostring ()); LOG.I ("Test", "file.tostring ():" + file.tostring ()); LOG.I ("Test", "file.exists () file exists, obtained locally:" + drawable);} return drawable;}
Here is the output:
============ Solution 1============
Reference 4 Floor u014274707 's reply:
Quote: Referring to the reply of the 3 floor Svenwang:
Quote: Referring to the reply of the 2 floor u014274707:
Quote: References 1 floor svenwang reply:
Your The problem arises:
1. The first call to the function, because it does not exist locally, so go to the network download.
2. Because you access the network in the UI thread, it causes an exception and generates an empty file with a length of 0 locally.
3. The second call to the function, because the local file exists, so the Else branch is executed
4. Because the contents of the file are empty, Drawable.createfrompath returns a null
Workaround:
1. Do not in the UI line Download files in the process.
2. Delete residual files when the download file has an exception. The problem with
is that I didn't download it in the UI thread, and Logcat did not report exception, I was calling the method on the line constructor. As follows:
executor = new threadpoolexecutor (1, 50, 180, Timeunit.seconds, queue);// Use the thread pool to do the task of downloading pictures Executor.execute (new runnable () {@Overridepublic void run () {drawable drawable = loadimagefromurl (CONTEXT,&NBSP;IMAGEURL); Imagecache.put (imageurl, new softreference<drawable> (drawable));
Message message = handler.obtainmessage (0, drawable); handler.sendmessage (message);});
This could be caused by the failure of the download to cause the contents of the local file to be incomplete. You can check the/data/data/com.roy.activity/cache/test01_upload_1.jpg.
This file.
What is the reason for the download failure? What can I do to make the picture display correctly?
Did you check the local/data/data/com.roy.activity/cache/test01_upload_1.jpg file for a problem?
Because the network causes download interruption or the failure is very common thing, the specific reason depends on the information in the exception.
Android Picture Download problem