2012-03-22 121 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()); 

這允許運行您的代碼,但不建議。

相關問題