我尝试下载图片并将其设置为imageView,但我收到了以下logcat。
05-04 23:04:52.565: W/ActivityThread(4353): Application com.itcuties.app is waiting for the debugger on port 8100...
05-04 23:04:52.575: I/System.out(4353): Sending WAIT chunk
05-04 23:04:52.815: I/dalvikvm(4353): Debugger is active
05-04 23:04:52.975: I/System.out(4353): Debugger has connected
05-04 23:04:52.975: I/System.out(4353): waiting for debugger to settle...
05-04 23:04:53.175: I/System.out(4353): waiting for debugger to settle...
05-04 23:04:53.375: I/System.out(4353): waiting for debugger to settle...
05-04 23:04:53.575: I/System.out(4353): waiting for debugger to settle...
05-04 23:04:53.775: I/System.out(4353): waiting for debugger to settle...
05-04 23:04:53.975: I/System.out(4353): waiting for debugger to settle...
05-04 23:04:54.175: I/System.out(4353): waiting for debugger to settle...
05-04 23:04:54.375: I/System.out(4353): waiting for debugger to settle...
05-04 23:04:54.575: I/System.out(4353): debugger has settled (1499)
05-04 23:04:54.835: D/ProgressBar(4353): setProgressDrawable mProgressDrawable = null, d = android.graphics.drawable.LayerDrawable@42344d10needUpdate = false
05-04 23:04:54.835: D/ProgressBar(4353): setProgressDrawable drawableHeight = 32
05-04 23:04:54.835: D/ProgressBar(4353): setProgress = 0
05-04 23:04:54.835: D/ProgressBar(4353): setProgress = 0, fromUser = false
05-04 23:04:54.835: D/ProgressBar(4353): mProgress = 0mIndeterminate = false, mMin = 0, mMax = 100
05-04 23:04:54.865: W/System.err(4353): java.io.IOException: Error connecting
05-04 23:04:54.875: W/System.err(4353): at com.itcuties.app.SplashActivity.OpenHttpConnection(SplashActivity.java:79)
05-04 23:04:54.875: W/System.err(4353): at com.itcuties.app.SplashActivity.DownloadImage(SplashActivity.java:41)
05-04 23:04:54.875: W/System.err(4353): at com.itcuties.app.SplashActivity.onCreate(SplashActivity.java:95)
05-04 23:04:54.875: W/System.err(4353): at android.app.Activity.performCreate(Activity.java:5372)
05-04 23:04:54.875: W/System.err(4353): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
05-04 23:04:54.875: W/System.err(4353): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
05-04 23:04:54.875: W/System.err(4353): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
05-04 23:04:54.875: W/System.err(4353): at android.app.ActivityThread.access$700(ActivityThread.java:168)
05-04 23:04:54.885: W/System.err(4353): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
05-04 23:04:54.885: W/System.err(4353): at android.os.Handler.dispatchMessage(Handler.java:99)
05-04 23:04:54.885: W/System.err(4353): at android.os.Looper.loop(Looper.java:176)
05-04 23:04:54.885: W/System.err(4353): at android.app.ActivityThread.main(ActivityThread.java:5493)
05-04 23:04:54.885: W/System.err(4353): at java.lang.reflect.Method.invokeNative(Native Method)
05-04 23:04:54.885: W/System.err(4353): at java.lang.reflect.Method.invoke(Method.java:525)
05-04 23:04:54.885: W/System.err(4353): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1225)
05-04 23:04:54.885: W/System.err(4353): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1041)
05-04 23:04:54.885: W/System.err(4353): at dalvik.system.NativeStart.main(Native Method)
这是我的活动,即
package com.itcuties.app;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.itcuties.app.reader.data.RssAtomItem;
import com.itcuties.app.reader.data.RssResults;
import com.itcuties.app.util.atom.RssAtomReader;
/**
* Application splash screen. It also loads data.
*
* @author ITCuties
*
*/
public class SplashActivity extends Activity {
private ProgressBar progressBar;
public ImageView img;
public Toast t;
public Bitmap DownloadImage(String URL)
{
Bitmap bitmap = null;
InputStream in = null;
try {
in = OpenHttpConnection(URL);
bitmap = BitmapFactory.decodeStream(in);
in.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return bitmap;
}
@SuppressWarnings("unused")
private InputStream OpenHttpConnection(String urlString)
throws IOException
{
InputStream in = null;
int response = -1;
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
if (!(conn instanceof HttpURLConnection))
throw new IOException("Not an HTTP connection");
try{
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
response = httpConn.getResponseCode();
if (response == HttpURLConnection.HTTP_OK) {
in = httpConn.getInputStream();
}
}
catch (Exception ex)
{
throw new IOException("Error connecting");
}
return in;
}
public String done = "Done";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
Bitmap bitmap =
DownloadImage(
"http://media-cache-ec0.pinimg.com/236x/af/38/5f/af385f471568e3e9f1d97bfe6e79652f.jpg");
img = (ImageView) findViewById(R.id.imageViewCategoryIcon);
img.setImageBitmap(bitmap);
progressBar = (ProgressBar)findViewById(R.id.progressBar);
progressBar.setProgress(0); // No progress so far
// Download data in the new thread
GetRSSDataTask grdt = new GetRSSDataTask();
grdt.execute("http://blanketcoffee.blogspot.com/feeds/posts/default");
}
/**
* Read RSS channel data.
*
* @author ITCuties
*
*/
private class GetRSSDataTask extends AsyncTask<String, Void, List<RssAtomItem> > {
@Override
protected List<RssAtomItem> doInBackground(String... urls) {
try {
// Create RSS reader
RssAtomReader rssReader = new RssAtomReader(urls[0]);
rssReader.setProgressBar(progressBar); // Set the progress bar to show real progress
// Parse RSS, get items
return rssReader.getItems();
} catch (Exception e) {
Log.e("BlanketCoffeeRSS", e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(List<RssAtomItem> results) {
// When the download is done the main activity needs to be started
Intent i = new Intent(SplashActivity.this, ListPostsActivity.class);
// You might find this not right to use a static attribute to pass data between the
// the activities in the application. We tried to pass the List of the RssAtomItem
// object with no luck although RssAtomItem implemented Serializable interface.
// ListPostActivity read null values. So this is the engineer's solution. It works :)
RssResults.setResults(results); //We need to set the results of the download process
// Show 100% progress
progressBar.setProgress(100);
Toast.makeText(getApplicationContext(), R.string.done, t.LENGTH_SHORT).show();
// Start new activity and finish this splash activity
SplashActivity.this.startActivity(i);
SplashActivity.this.finish();
}
}
}
这是我设置导致问题的图像的方式还是进度条?
答案 0 :(得分:0)
主要问题是您正在尝试从MainThread
下载图像,所有网络请求都应该在后台线程中执行。
因此OpenHttpConnection
方法在尝试建立NetworkOnMainThreadException
时收到了HttpURLConnection
,并且它会返回IOException("Error connecting")
更改您的代码以使用AsyncTask
下载图片。最好的方法是将ImageView
和URL
传递给下载方法并在后台执行
使用此优化代码下载图像并将其设置为ImageView
public void DownloadImage(final ImageView imageView , final String url)
{
new AsyncTask<Void, Integer, Bitmap>() {
@Override
protected Bitmap doInBackground(Void... params) {
try {
InputStream inputStream = new URL(url).openConnection().getInputStream();
return BitmapFactory.decodeStream(inputStream);
} catch (Exception ex) {
// handle the exception here
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if(bitmap != null) {
imageView.setImageBitmap(bitmap);
}
}
}.execute();
}
在设置内容视图后,从OnCreate
调用此方法。
img = (ImageView) findViewById(R.id.imageViewCategoryIcon);
DownloadImage(img,
"http://media-cache-ec0.pinimg.com/236x/af/38/5f/af385f471568e3e9f1d97bfe6e79652f.jpg");