2012-03-22 128 views
0

我需要使用一个ActionBar,所以我需要将targetSdkVersion更改为11. 它目前是targetSdkVersion =“8”。 它适用于targetSdkVersion =“8”,但是当我将其更改为targetSdkVersion =“11”时,它崩溃。当我更改targetSdkVersion时,为什么我的程序崩溃?

错误来源于此行:imageA = new ImageAdapter(this,url);

错误:

  • 03-21 22:09:56.710:E/AndroidRuntime(21824):了java.lang.RuntimeException:无法启动活动ComponentInfo {com.ameba.api/com.ameba .api.Home}:android.os.NetworkOnMainThreadException

我已经试过在的AsyncTask <封装几乎每一个方法>的错误不再抛出,但ImageAdapter()(永远不会被调用)不工作时我这样做。

这是一段代码。

public void onCreate(Bundle bundle) { 
    super.onCreate(bundle);  
    setContentView(R.layout.home); 


    title = (TextView)findViewById(R.id.title); 
    description = (TextView)findViewById(R.id.description);   
    gridView = (GridView)findViewById(R.id.propGridView); 
    thumbNail = (ImageView)findViewById(R.id.propertyThumbnail); 
    //thumbNail.setImageBitmap(bm); 
    gridView.setVerticalSpacing(3); 
    gridView.setHorizontalSpacing(3); 

    //checkHistory(); 

    ImageDownloader.Mode mode = ImageDownloader.Mode.CORRECT;   

    historyStack.pushValue(url);          // Push Value onto history stack 
    Log.i("No history:",url+" "+historyStack.getStack().size());  //Debug 
    imageA= new ImageAdapter(this,url);  
    imageA.getImageDownloader().setMode(mode);       //Set download mode to cache    
    gridView.setAdapter(imageA);          //Populate gridView with downloaded bitmap  
} 

public class ImageAdapter extends BaseAdapter { 

//intialize variables 
private final ImageDownloader imageDownloader ; 
private int SIZE; 
private List<Video> myVideos; 
private Context mContext; 
private String xmlurl; 
private Parser parser = new Parser(); 


/* 
* Constructor 
* @params: Context 
* @params: XML url 
*/ 
public ImageAdapter(Context c, String url){ 
    mContext = c; 
    xmlurl = url; 
    parser.runParser(xmlurl);  
    imageDownloader = new ImageDownloader(); 
} 

/* 
* (non-Javadoc) 
* @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup) 
*/ 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final ImageView view; 
    if (convertView == null) { 
     view= new ImageView(mContext); 
     view.setLayoutParams(new GridView.LayoutParams(175,175)); 
     view.setPadding(1, 1, 1, 1); 

    } 
    else{ 
     view = (ImageView)convertView; 
    } 
    Log.i("Assingning view",""); 
    imageDownloader.download(parser.getList().get(position).getThumbNail(),view);  
    return view; 
} 

/* 
* (non-Javadoc) 
* @see android.widget.Adapter#getCount() 
*/ 
public int getCount() { 
    SIZE = parser.getCount(); 
    return SIZE; 
} 

/* 
* (non-Javadoc) 
* @see android.widget.Adapter#getItem(int) 
*/ 
public String getItem(int position) { 
    return myVideos.get(position).toString(); 
} 

/* 
* (non-Javadoc) 
* @see android.widget.Adapter#getItemId(int) 
*/ 
public long getItemId(int position) { 
    return 0; 
} 

public void setUrl(String url){ 
    xmlurl = url; 
} 

/* 
* getMethod 
*/ 
public ImageDownloader getImageDownloader() { 
    return imageDownloader; 
} 



    } 

回答

2

在异常

Android.os.NetworkOnMainThreadException 

它告诉你什么是错看看。您正尝试在主UI线程上执行网络活动(下载您的图像)。在以前的Android版本中,不考虑设备的性能。因为在UI线程上下载会严重影响应用程序的性能,所以不鼓励这种方式,而在以后的Android版本中会抛出上面的错误。

将您的图片下载到一个单独的线程,这个错误将消失。

+0

是的,我做到了,错误不再被抛出。但是,图像不再出现。 – Fabii 2012-03-22 19:25:08

+1

看看一些源代码做懒惰图像加载[这里](https://github.com/thest1/LazyList)。如果你实现它,你将拥有一个非常快速的即插即用图像加载器来完成你的活动。它也非常高效。这将防止您在下载完成时处理回调以及管理您的图像查看,我想像的是您遇到问题的地方,并且正在导致图像显示出来 – dymmeh 2012-03-22 19:29:13

+0

谢谢感谢您的帮助。 – Fabii 2012-03-23 04:19:11

0

你应该程序线程imageDownloader或者,如果你想运行的代码目前已经在OnCreate中添加:

StrictMode.setThreadPolicy(
      new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().detectAll().permitNetwork().build()); 

这允许运行您的代码,但不建议。

相关问题