課程
/移動開發(fā)
/Android
/Android必學(xué)-異步加載
就是點(diǎn)開程序他不加載圖片,顯示的是系統(tǒng)圖片,要往下滑才能加載,應(yīng)該不是網(wǎng)絡(luò)原因,因?yàn)闆]加緩存之前好像沒這個問題、
2016-09-23
源自:Android必學(xué)-異步加載 3-3
正在回答
解決辦法:將mImageView和mUrl聲明在AsyncTask中,刪除在ImageLorder中的聲明。老師在ImageLorder中聲明是為了Handler使用,我們這里將Handler的內(nèi)容全部刪除其實(shí)是沒有影響的。原理:如果我們在adapter構(gòu)造方法中初始化ImageView,全局只有一個ImageLorder,而在ImageLoder中聲明mImageView和mUrl,那么adapter沒調(diào)用一次ShowImageByAsynctask,mImageViedw和mUrl就會被初始化一次,導(dǎo)致上一個bitmap形成后需要賦值的ImageVIew卻發(fā)生了改變,無法加載成功。解決辦法:1:getview()方法每次都new ImageLorder ?不推薦2:adapter構(gòu)造方法中初始化ImageLorder,但是mImageView和mUrl在Asynctask中聲明,避免被覆蓋
我只能告訴你發(fā)揮作用的代碼是在哪?但是如何解決我也不知道如果你是在getView()方法中ImageLorder=new ImageLorder()的話,就不會出現(xiàn)這個問題。但如果是在構(gòu)造方法中初始化的,就會出現(xiàn)這個問題。
解決了嗎?
但是我的監(jiān)聽器里面還沒寫函數(shù)額 package?com.example.newapplication; import?java.io.BufferedInputStream; import?java.io.IOException; import?java.io.InputStream; import?java.io.InputStreamReader; import?java.net.HttpURLConnection; import?java.net.MalformedURLException; import?java.net.URL; import?android.graphics.Bitmap; import?android.graphics.BitmapFactory; import?android.os.AsyncTask; import?android.os.Handler; import?android.os.Message; import?android.support.v4.util.LruCache; import?android.widget.ImageView; public?class?ImageLoader?{ private?ImageView?mimageView; private?String?murl; private?LruCache<String?,?Bitmap>?mCache; public??ImageLoader(){ int?MaxMemery?=?(int)?Runtime.getRuntime().maxMemory(); //先獲得最大內(nèi)存 int?cacheSize?=?MaxMemery/4; mCache?=?new?LruCache<String,?Bitmap>(cacheSize){ protected?int?sizeOf(String?key,?Bitmap?value)?{ return?value.getByteCount(); //每次把圖片加入緩存時會調(diào)用?用來返回每張圖片的大小 } }; } public?void?AddBitmapToCache(String?url,Bitmap?bitmap){ if?(mCache.get(url)==null)?{ mCache.put(url,?bitmap); } } public?Bitmap?getBitmapFromCache(String?url){ return?mCache.get(url); } //通過handler更新ui private?Handler?handler?=?new?Handler(){ public?void?handleMessage(android.os.Message?msg)?{ super.handleMessage(msg); if?(mimageView.getTag().equals(murl))?{ //只有圖片和url匹配時才設(shè)置圖片?使他一一對應(yīng) mimageView.setImageBitmap((Bitmap)?msg.obj); } }; }; public?void?showImageByAsyncTask(ImageView?imageView,?String?url)?{ Bitmap?bitmap?=?getBitmapFromCache(url); //?從緩存中取出對應(yīng)的圖片 if?(bitmap?==?null)?{ //?如果緩存中沒有,那么必須下載 // imageView.setImageResource(R.drawable.ic_launcher); //?為空的時候先設(shè)置為自帶圖標(biāo) new?NewsAsyncTask(imageView,murl).execute(url); }?else?{ imageView.setImageBitmap(bitmap); } // new?NewsAsyncTask(imageView,murl).execute(url); } // public?void?ShowImageByThread(ImageView?imageView,final?String?url){ // mimageView?=?imageView; // murl?=?url; // new?Thread(){ // public?void?run()?{ // super.run(); // Bitmap?bitmap?=?GetBitmapFromUrl(url); //通過下面的方法獲取Bitmap對象?然后交給handler傳給主線程更新UI // Message?message?=?new?Message().obtain();//獲得massage對象 // message.obj?=?bitmap; // handler.sendMessage(message); // } // }.start(); // } public?Bitmap?GetBitmapFromUrl(String?urlString){ InputStream?is?=?null; try?{ URL?url?=?new?URL(urlString); HttpURLConnection?httpURLConnection?=?(HttpURLConnection)?url.openConnection(); //獲得URL之后獲得連接 is?=?new?BufferedInputStream(httpURLConnection.getInputStream()); Bitmap?bitmap?=?BitmapFactory.decodeStream(is); //將輸入流轉(zhuǎn)換成Bitmap對象 httpURLConnection.disconnect(); return?bitmap; }?catch?(MalformedURLException?e)?{ e.printStackTrace(); }?catch?(IOException?e)?{ e.printStackTrace(); }finally{ try?{ is.close(); }?catch?(IOException?e)?{ e.printStackTrace(); } } return?null; } private?class?NewsAsyncTask?extends?AsyncTask<String,?Void,?Bitmap>?{ public?NewsAsyncTask(ImageView?imageView,String?url)?{ mimageView?=?imageView; murl?=?url; } @Override protected?Bitmap?doInBackground(String...?params)?{ String?url?=?params[0]; Bitmap?bitmap?=?GetBitmapFromUrl(url);//?從網(wǎng)絡(luò)獲取圖片?前面bitmap一直沒內(nèi)容?現(xiàn)在才從網(wǎng)上獲取資源 if?(bitmap?!=?null)?{ AddBitmapToCache(url,?bitmap); //?將圖片加入緩存 } return?bitmap; } @Override protected?void?onPostExecute(Bitmap?bitmap)?{ super.onPostExecute(bitmap); // ImageView?imageView?=?(ImageView)?mListView.findViewWithTag(mUrl); // if?(imageView?!=?null?&&?bitmap?!=?null)?{ // imageView.setImageBitmap(bitmap); // } // mTask.remove(this); // if?(mimageView.getTag().equals(murl))?{ //前面在Myadapter里面已經(jīng)將圖片對應(yīng)url,如果對應(yīng)才設(shè)置圖片 // mimageView.setImageBitmap(bitmap); // } ?if(mimageView.getTag()==null){//初始化時并未設(shè)置Tag ?????mimageView.setTag(murl); }else?if(mimageView.getTag().equals(murl)){//已經(jīng)設(shè)置過Tag ????mimageView.setImageBitmap(bitmap); } } } } package?com.example.newapplication; import?java.util.List; import?java.util.zip.Inflater; import?android.content.Context; import?android.view.LayoutInflater; import?android.view.View; import?android.view.ViewGroup; import?android.widget.AbsListView; import?android.widget.AbsListView.OnScrollListener; import?android.widget.BaseAdapter; import?android.widget.ImageView; import?android.widget.TextView; public?class?MyAdapter?extends?BaseAdapter{ private?List<NewsBean>?mList; private?LayoutInflater?inflater; private?ImageLoader?mimageLoader; private?int?mStart,mEnd; public?static?String[]?URLS; public?MyAdapter(List<NewsBean>?data,Context?context){ mList?=?data; inflater?=?LayoutInflater.from(context); mimageLoader?=?new?ImageLoader(); //初始化ImageLoader,避免后面重復(fù)創(chuàng)建 URLS?=?new?String[data.size()]; for?(int?i?=?0;?i?<?data.size();?i++)?{ URLS[i]?=?data.get(i).imageViewURL; } } public?int?getCount()?{ return?mList.size(); } @Override public?Object?getItem(int?position)?{ //?TODO?Auto-generated?method?stub return?mList.get(position); } @Override public?long?getItemId(int?position)?{ //?TODO?Auto-generated?method?stub return?position; } @Override public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{ ViewHolder?holder; if?(convertView==null)?{ //如果該view對象為空?則創(chuàng)建?否則?直接通過Gettag()方法獲得 holder?=?new?ViewHolder(); convertView?=?inflater.inflate(R.layout.item_layout,?null); //將顯示樣式轉(zhuǎn)換成View對象 holder.imageView?=?(ImageView)?convertView.findViewById(R.id.imageView1); //初始化holder的組件?find樣式中的id holder.Title?=?(TextView)?convertView.findViewById(R.id.Item_tv1); holder.conten?=?(TextView)?convertView.findViewById(R.id.Item_tv2); convertView.setTag(holder); }else?{ holder?=?(ViewHolder)?convertView.getTag(); } //設(shè)置控件的資源 holder.imageView.setImageResource(R.drawable.ic_launcher); String?url?=?mList.get(position).imageViewURL; holder.imageView.setTag(url); //將圖片和url綁定 mimageLoader.showImageByAsyncTask(holder.imageView,?url); //設(shè)置圖片 holder.Title.setText(mList.get(position).Title); //設(shè)置標(biāo)題 holder.conten.setText(mList.get(position).content); return?convertView; } //通過該對象?避免重復(fù)創(chuàng)建View對象 class?ViewHolder{ ImageView?imageView; TextView?Title,conten; } // public?void?onScrollStateChanged(AbsListView?view,?int?scrollState)?{ // if?(scrollState==SCROLL_STATE_IDLE)?{ //表示此時滑動在停止?fàn)顟B(tài) // // } // } // @Override // public?void?onScroll(AbsListView?view,?int?firstVisibleItem, // int?visibleItemCount,?int?totalItemCount)?{ // mStart?=?firstVisibleItem; // mEnd?=?firstVisibleItem+visibleItemCount; // } }
老師課程的最后一課中有講首次啟動預(yù)加載。因?yàn)閯倖拥臅r候并沒有觸發(fā)停止的監(jiān)聽器,但加載的操作是在這個狀態(tài)改變的監(jiān)聽器的實(shí)現(xiàn)函數(shù)中實(shí)現(xiàn)的。解決辦法就是在首次啟動時因?yàn)橛|發(fā)滾動的監(jiān)聽器,將加載的操作在這個監(jiān)聽器中只在開始時做一次。
舉報
了解Android中的異步加載處理方法,這是面試問的最多的知識點(diǎn)
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2018-02-01
解決辦法:將mImageView和mUrl聲明在AsyncTask中,刪除在ImageLorder中的聲明。老師在ImageLorder中聲明是為了Handler使用,我們這里將Handler的內(nèi)容全部刪除其實(shí)是沒有影響的。
原理:如果我們在adapter構(gòu)造方法中初始化ImageView,全局只有一個ImageLorder,而在ImageLoder中聲明mImageView和mUrl,那么adapter沒調(diào)用一次ShowImageByAsynctask,mImageViedw和mUrl就會被初始化一次,導(dǎo)致上一個bitmap形成后需要賦值的ImageVIew卻發(fā)生了改變,無法加載成功。
解決辦法:
1:getview()方法每次都new ImageLorder ?不推薦
2:adapter構(gòu)造方法中初始化ImageLorder,但是mImageView和mUrl在Asynctask中聲明,避免被覆蓋
2018-01-31
我只能告訴你發(fā)揮作用的代碼是在哪?但是如何解決我也不知道
如果你是在getView()方法中ImageLorder=new ImageLorder()的話,就不會出現(xiàn)這個問題。但如果是在構(gòu)造方法中初始化的,就會出現(xiàn)這個問題。
2016-09-25
解決了嗎?
2016-09-24
2016-09-23
老師課程的最后一課中有講首次啟動預(yù)加載。因?yàn)閯倖拥臅r候并沒有觸發(fā)停止的監(jiān)聽器,但加載的操作是在這個狀態(tài)改變的監(jiān)聽器的實(shí)現(xiàn)函數(shù)中實(shí)現(xiàn)的。解決辦法就是在首次啟動時因?yàn)橛|發(fā)滾動的監(jiān)聽器,將加載的操作在這個監(jiān)聽器中只在開始時做一次。