Android 为什么我的程序在更改targetSdkVersion时崩溃?
我需要利用一个ActionBar,所以我需要将targetSdkVersion更改为11。 它当前是targetSdkVersion=“8”它与targetSdkVersion=“8”配合使用效果良好,但当我将其更改为targetSdkVersion=“11”时,它会崩溃 错误源于此行:imageA=newimageadapter(此url)强> 错误:Android 为什么我的程序在更改targetSdkVersion时崩溃?,android,Android,我需要利用一个ActionBar,所以我需要将targetSdkVersion更改为11。 它当前是targetSdkVersion=“8”它与targetSdkVersion=“8”配合使用效果良好,但当我将其更改为targetSdkVersion=“11”时,它会崩溃 错误源于此行:imageA=newimageadapter(此url) 错误: 03-21 22:09:56.710:E/AndroidRuntime(21824):java.lang.RuntimeException:无法
- 03-21 22:09:56.710:E/AndroidRuntime(21824):java.lang.RuntimeException:无法启动活动组件信息{com.ameba.api/com.ameba.api.Home}:android.os.NetworkOnMainThreadException
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;
}
}
public void onCreate(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);
缩略图=(ImageView)findViewById(R.id.propertyThumbnail);
//缩略图.setImageBitmap(bm);
gridView.setVerticalSpacing(3);
gridView.setHorizontalSpacing(3);
//检查历史();
ImageDownloader.Mode模式=ImageDownloader.Mode.CORRECT;
historyStack.pushValue(url);//将值推送到历史堆栈上
Log.i(“无历史记录:”,url+“”+historyStack.getStack().size());//调试
imageA=新的ImageAdapter(此,url);
imageA.getImageDownloader().setMode(mode);//将下载模式设置为缓存
setAdapter(imageA);//用下载的位图填充gridView
}
公共类ImageAdapter扩展了BaseAdapter{
//初始化变量
私人最终图像下载器图像下载器;
私有整数大小;
私人名单;
私有上下文;
私有字符串xmlurl;
私有解析器=新解析器();
/*
*建造师
*@params:Context
*@params:XML-url
*/
公共ImageAdapter(上下文c,字符串url){
mContext=c;
xmlurl=url;
runParser(xmlurl);
imageDownloader=新的imageDownloader();
}
/*
*(非Javadoc)
*@see android.widget.Adapter#getView(int,android.view.view,android.view.ViewGroup)
*/
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终图像视图;
if(convertView==null){
视图=新图像视图(mContext);
view.setLayoutParams(新的GridView.LayoutParams(175175));
视图。设置填充(1,1,1,1);
}
否则{
视图=(图像视图)转换视图;
}
Log.i(“assingview”,简称“);
下载(parser.getList().get(position.getThumbNail(),view);
返回视图;
}
/*
*(非Javadoc)
*@see android.widget.Adapter#getCount()
*/
public int getCount(){
SIZE=parser.getCount();
返回大小;
}
/*
*(非Javadoc)
*@see android.widget.Adapter#getItem(int)
*/
公共字符串getItem(int位置){
返回myVideos.get(position.toString();
}
/*
*(非Javadoc)
*@see android.widget.Adapter#getItemId(int)
*/
公共长getItemId(int位置){
返回0;
}
公共void setUrl(字符串url){
xmlurl=url;
}
/*
*getMethod
*/
公共ImageDownloader getImageDownloader(){
返回图像下载器;
}
}
查看异常
Android.os.NetworkOnMainThreadException
它确切地告诉你出了什么问题。您正试图在主UI线程上执行网络活动(下载图像)。在以前的Android版本中,这是允许的,不考虑设备性能。由于在UI线程上下载会严重影响应用程序的性能,因此不鼓励这样做,并且在更高版本的Android中会抛出上面所示的错误
将图像下载移动到单独的线程中,此错误将消失 您应该在线程中对imageDownloader进行编程,或者如果您想立即运行代码,请在创建时加载项:
StrictMode.setThreadPolicy(
new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().detectAll().permitNetwork().build());
这允许您运行代码,但不建议您这样做。是的,我这样做了,并且不再抛出错误。但是,图像不再出现。请查看一些源代码,以执行惰性图像加载。如果你实现它,你将有一个很好的,快速的即插即用图像加载器为你的活动。它也相当有效。这将防止您在下载完成时处理回调,以及管理您的ImageView,我认为这是您遇到问题的地方,并使您的图像现在显示感谢您的帮助。我实现了lazy loader示例。它在模拟器上工作,但不在设备上显示图像。您确定设备上的连接良好吗?您是否具有清单中指定的internet权限?您的设备是否有外部存储器?