亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

為什么我的藥滑動之后才加載圖片啊

就是點開程序他不加載圖片,顯示的是系統圖片,要往下滑才能加載,應該不是網絡原因,因為沒加緩存之前好像沒這個問題、

正在回答

5 回答

解決辦法:將mImageView和mUrl聲明在AsyncTask中,刪除在ImageLorder中的聲明。老師在ImageLorder中聲明是為了Handler使用,我們這里將Handler的內容全部刪除其實是沒有影響的。
原理:如果我們在adapter構造方法中初始化ImageView,全局只有一個ImageLorder,而在ImageLoder中聲明mImageView和mUrl,那么adapter沒調用一次ShowImageByAsynctask,mImageViedw和mUrl就會被初始化一次,導致上一個bitmap形成后需要賦值的ImageVIew卻發生了改變,無法加載成功。
解決辦法:
1:getview()方法每次都new ImageLorder ?不推薦
2:adapter構造方法中初始化ImageLorder,但是mImageView和mUrl在Asynctask中聲明,避免被覆蓋

0 回復 有任何疑惑可以回復我~

我只能告訴你發揮作用的代碼是在哪?但是如何解決我也不知道
如果你是在getView()方法中ImageLorder=new ImageLorder()的話,就不會出現這個問題。但如果是在構造方法中初始化的,就會出現這個問題。

0 回復 有任何疑惑可以回復我~

解決了嗎?

0 回復 有任何疑惑可以回復我~
但是我的監聽器里面還沒寫函數額
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();	//先獲得最大內存
		int?cacheSize?=?MaxMemery/4;
		mCache?=?new?LruCache<String,?Bitmap>(cacheSize){
			protected?int?sizeOf(String?key,?Bitmap?value)?{
				return?value.getByteCount();		//每次把圖片加入緩存時會調用?用來返回每張圖片的大小
			}
		};
	}
	
	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匹配時才設置圖片?使他一一對應
				mimageView.setImageBitmap((Bitmap)?msg.obj);
			}
		};
	};
	public?void?showImageByAsyncTask(ImageView?imageView,?String?url)?{
		Bitmap?bitmap?=?getBitmapFromCache(url);		//?從緩存中取出對應的圖片
		if?(bitmap?==?null)?{		//?如果緩存中沒有,那么必須下載
//			imageView.setImageResource(R.drawable.ic_launcher);		//?為空的時候先設置為自帶圖標
			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);		//將輸入流轉換成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);//?從網絡獲取圖片?前面bitmap一直沒內容?現在才從網上獲取資源
			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里面已經將圖片對應url,如果對應才設置圖片
//				mimageView.setImageBitmap(bitmap);
//			}
			?if(mimageView.getTag()==null){//初始化時并未設置Tag

			?????mimageView.setTag(murl);

			}else?if(mimageView.getTag().equals(murl)){//已經設置過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,避免后面重復創建
		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對象為空?則創建?否則?直接通過Gettag()方法獲得
			holder?=?new?ViewHolder();
			convertView?=?inflater.inflate(R.layout.item_layout,?null);	//將顯示樣式轉換成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();
		}
		//設置控件的資源
		holder.imageView.setImageResource(R.drawable.ic_launcher);
		String?url?=?mList.get(position).imageViewURL;
		holder.imageView.setTag(url);		//將圖片和url綁定
		mimageLoader.showImageByAsyncTask(holder.imageView,?url);	//設置圖片
		holder.Title.setText(mList.get(position).Title);		//設置標題
		holder.conten.setText(mList.get(position).content);
		return?convertView;
	}
	//通過該對象?避免重復創建View對象
	class?ViewHolder{
		ImageView?imageView;
		TextView?Title,conten;
	}
//	public?void?onScrollStateChanged(AbsListView?view,?int?scrollState)?{
//		if?(scrollState==SCROLL_STATE_IDLE)?{	//表示此時滑動在停止狀態
//			
//		}
//	}
//	@Override
//	public?void?onScroll(AbsListView?view,?int?firstVisibleItem,
//			int?visibleItemCount,?int?totalItemCount)?{
//			mStart?=?firstVisibleItem;
//			mEnd?=?firstVisibleItem+visibleItemCount;
//	}
}


0 回復 有任何疑惑可以回復我~

老師課程的最后一課中有講首次啟動預加載。因為剛啟動的時候并沒有觸發停止的監聽器,但加載的操作是在這個狀態改變的監聽器的實現函數中實現的。解決辦法就是在首次啟動時因為觸發滾動的監聽器,將加載的操作在這個監聽器中只在開始時做一次。

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
Android必學-異步加載
  • 參與學習       50616    人
  • 解答問題       333    個

了解Android中的異步加載處理方法,這是面試問的最多的知識點

進入課程

為什么我的藥滑動之后才加載圖片啊

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號