当我更改targetSdkVersion时,为什么我的程序会崩溃?

时间:2012-03-22 18:49:25

标签: android

我需要使用ActionBar,所以我需要将targetSdkVersion更改为11。 它目前是targetSdkVersion =“8”。 它可以正常使用targetSdkVersion =“8”,但当我将其更改为targetSdkVersion =“11”时,它会崩溃。

错误源自此行: 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 个答案:

答案 0 :(得分:2)

看看异常

Android.os.NetworkOnMainThreadException

它告诉你究竟出了什么问题。您正尝试在主UI线程上执行网络活动(下载图像)。在之前的Android版本中,这是允许的,而不考虑设备性能。因为在UI线程上下载会严重影响应用程序的性能,所以不建议这样做,因为在以后的Android版本中会抛出您在上面看到的错误。

将图像下载到单独的线程中,此错误将消失。

答案 1 :(得分:0)

您应该在线程中编写imageDownloader,或者如果您想立即运行代码,请添加OnCreate:

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

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