在學(xué)習(xí)了javaSE過(guò)后,現(xiàn)在開(kāi)始繼續(xù)我的android生活,之前學(xué)習(xí)完JavaSE,通過(guò)UI界面做過(guò)模擬游戲《貪吃蛇》和基本版計(jì)算器,現(xiàn)在學(xué)習(xí)Android接近有20天的時(shí)間,開(kāi)始制作模擬手機(jī)助手下載,制作手機(jī)助手下載,關(guān)鍵是練習(xí)一下listview,和listview一些相關(guān)的優(yōu)化,以及優(yōu)化所產(chǎn)生的一些bug和解決。
創(chuàng)新互聯(lián)長(zhǎng)期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為廊坊企業(yè)提供專業(yè)的做網(wǎng)站、網(wǎng)站設(shè)計(jì),廊坊網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
本次需呀用到hfs外部軟件,來(lái)解決網(wǎng)絡(luò)的問(wèn)題,和一些圖片,用于下載時(shí)候的顯示。例如手機(jī)qq、微信、等一些軟件,
下載軟件的時(shí)候需要下載是時(shí)間,因?yàn)槲覀兊膍ain主線程不能做耗時(shí)工作,所以下載的時(shí)候需要在子線程里面下載,這邊需要用的AsyncTask。AsyncTask中的doInBackground是在子線程中下載,onProgressUpdate、onPostExecute(String)和onPostExecute都是在主線程中操作,onProgressUpdate是在doInBackground中下載一半的時(shí)候,想要對(duì)主線程進(jìn)行操作,onPostExecute是要進(jìn)行下載之前才執(zhí)行,onPostExecute(String)是下載之后才操作。
doInBackground(String)在下載的過(guò)程中我們需要傳輸下載路徑。
下載用到URL,例如:URL url = new URL(p_w_picpathUrl);剛開(kāi)始打開(kāi)軟件的時(shí)候,一開(kāi)始顯示整個(gè)頁(yè)面布局,和剛開(kāi)始我們軟件的圖標(biāo),log。都需要下載,下載圖片的用到BitmapFactory,例如:Bitmap bitmap=BitmapFactory.decodeStream(openStream);單下載完成后需要在頁(yè)面中更改,,因?yàn)橹骶€程中不能做頁(yè)面的更改進(jìn)行一系列的操作,所以需要在doInBackground中將下載好的bitmap return到onPostExecute,在onPostExecute中可以對(duì)主線程進(jìn)行做一系列的操作,p_w_picpath.setImageBitmap(result);這樣,一開(kāi)始的基本頁(yè)面既可以完成,如圖:
這些打開(kāi)軟件的是最基本的顯示,圖標(biāo)和數(shù)據(jù)都來(lái)自于網(wǎng)絡(luò),每次滑動(dòng)的時(shí)候都會(huì)不斷的下載圖標(biāo),下載在過(guò)的圖標(biāo)他會(huì)再次在下載,這個(gè)體驗(yàn)是非常不好的。所以我們?cè)谙螺d的圖標(biāo)過(guò)后要把bitmap保存起來(lái),當(dāng)已經(jīng)下載過(guò)的就不要再下載,直接從容器里面取。例如:Bitmap bitmap = p_w_picpathBitmaplist.get(position);在圖片bitmap 下載完后就保存起來(lái),不過(guò)在我們下載的過(guò)程中是需要時(shí)間的。所以在現(xiàn)在中如果還是快速的上下滑動(dòng)還是一樣會(huì)導(dǎo)致圖片多次下載,解決:因?yàn)槲覀冊(cè)诿看蜗螺d的時(shí)候都會(huì)new 出asyncTask 來(lái)對(duì)我們圖片進(jìn)行下載,例如:MyAsyncTask asyncTask = new MyAsyncTask(p_w_picpath,position);所以我們讓new 出的asyncTask 進(jìn)行有條件的執(zhí)行,把每一行先對(duì)應(yīng)的asyncTask 進(jìn)行保存。在每次要下在的時(shí)候先看一下容器里面的asyncTask 是否存在,如果存在的話說(shuō)明正在下載,我們就不用再進(jìn)行對(duì)應(yīng)的下載。例如:
Bitmap bitmap = p_w_picpathBitmaplist.get(position);
if (bitmap==null) {
MyAsyncTask asyncTask = asyncTasklist.get(position);
if (asyncTask==null) {
asyncTask = new MyAsyncTask(p_w_picpath,position);
asyncTask.execute(p_w_picpathUrllist.get(position));
asyncTasklist.put(position, asyncTask);
}
} else {
p_w_picpath.setImageBitmap(bitmap);
}
這樣子就可以在下載的時(shí)候避免多次下載圖標(biāo)。
對(duì)listview的優(yōu)化,在每次上下滑動(dòng)的時(shí)候會(huì)每次產(chǎn)生一個(gè)新的View。所以要對(duì)View進(jìn)行復(fù)用,可以用上一個(gè)消失的View convertView,來(lái)替換這個(gè)所要產(chǎn)生新的view。所以可以對(duì)convertView進(jìn)行判斷,如果convertView要是為null 的時(shí)候我們才創(chuàng)建一個(gè)新的View 。要是不為空的話,就直接拿起來(lái)復(fù)用,這丫可以解決資源問(wèn)題,不會(huì)造成資源浪費(fèi)。例如:
View inflate =null;
if (convertView==null) {
LayoutInflater layoutInflater = getLayoutInflater();
inflate = layoutInflater.inflate(R.layout.layout, null);
} else {
inflate=convertView;
}
和View 一樣,我們每次有聲明的一開(kāi)始聲明的
ImageView p_w_picpath = (ImageView) inflate.findViewById(R.id.p_w_picpath);
ProgressBar progressBar1 = (ProgressBar) inflate.findViewById(R.id.progressBar1);
Button button1 = (Button) inflate.findViewById(R.id.button1);
TextView text = (TextView) inflate.findViewById(R.id.textView1);
幾個(gè)組件,也可以對(duì)其復(fù)用。把這些都放在一個(gè)class里面需要的時(shí)候拿出來(lái)用就可以,例如:
View inflate =null;
Myview myview =null;
if (convertView==null) {
myview = new Myview();
LayoutInflater layoutInflater = getLayoutInflater();
inflate = layoutInflater.inflate(R.layout.layout, null);
myview.p_w_picpath = (ImageView) inflate.findViewById(R.id.p_w_picpath);
myview.progressBar1 = (ProgressBar) inflate.findViewById(R.id.progressBar1);
myview.button1 = (Button) inflate.findViewById(R.id.button1);
myview.text = (TextView) inflate.findViewById(R.id.textView1);
inflate.setTag(myview);
} else {
inflate=convertView;
myview=(Myview) inflate.getTag();
}
這樣的話可以進(jìn)行多次復(fù)用。;
但是由于復(fù)用的關(guān)系,在每次圖片還在下載的過(guò)程是如果圖片在第一張下載完成后,后面的圖片還沒(méi)有下載的關(guān)系,進(jìn)行上下的滑動(dòng)。會(huì)發(fā)現(xiàn),在發(fā)現(xiàn)在底下的時(shí)候有出現(xiàn)第一次的圖標(biāo),在過(guò)了一段時(shí)間后會(huì)發(fā)現(xiàn)圖片的跳變問(wèn)題,這個(gè)就是因?yàn)関iew復(fù)用,例如第7行復(fù)用第0行的時(shí)候,第7行的圖標(biāo)還沒(méi)有下載,原先應(yīng)該是默認(rèn)的原始圖片,但是由于在第0行的時(shí)候已經(jīng)對(duì)圖標(biāo)進(jìn)行更改,他已經(jīng)不是默認(rèn)的圖標(biāo),所以會(huì)顯示之前的圖標(biāo),
解決:在一開(kāi)始要下載圖標(biāo),更改圖片之前把圖片先改為我們默認(rèn)的圖片,例如:
myview.p_w_picpath.setImageResource(R.drawable.ic_launcher);
這樣只能解決基本的問(wèn)題,如果一開(kāi)始只是輕輕滑動(dòng)的話,是不會(huì)出現(xiàn)圖標(biāo)閃變,如果要是一開(kāi)始的時(shí)候在圖片還在下載的時(shí)候就進(jìn)行快速的上下滑動(dòng)的話,這樣還是會(huì)出現(xiàn)圖片閃跳。我們?cè)谳p輕滑動(dòng)的時(shí)候他view 的替換是有規(guī)律的,但是如果開(kāi)始滑動(dòng)的時(shí)候view是沒(méi)有規(guī)律,他的出現(xiàn)時(shí)不定像的,即在滑動(dòng)過(guò)程中,要對(duì)p_w_picpath進(jìn)行替換。
例如:
public void changview(ImageView p_w_picpath)
{
this.p_w_picpath = p_w_picpath;
}
asyncTask.changview(myview.p_w_picpath);
并且在下載完圖片的時(shí)候,必須對(duì)當(dāng)前行有顯示的才進(jìn)行更改。
例如:
int fvp = mlistview.getFirstVisiblePosition();
int lvp = mlistview.getLastVisiblePosition();
if (position>=fvp&&position<=lvp) {
//保存bitmap
p_w_picpathBitmaplist.put(position, result);
p_w_picpath.setImageBitmap(result);
}
以上是打開(kāi)界面時(shí)候最基本的顯示,一切數(shù)據(jù)都來(lái)自與網(wǎng)絡(luò),接下來(lái)就是當(dāng)我們點(diǎn)擊按鈕下載的時(shí)候,會(huì)進(jìn)行基本的文件下載,如同之前的圖片下載一樣,文件下載是在點(diǎn)擊下載后文件才會(huì)下載,所有操作如同上面圖片基本相同,唯一的就是在點(diǎn)擊下載的時(shí)候,文件的進(jìn)度條會(huì)跟隨的下載進(jìn)度不斷的進(jìn)行促發(fā)。這是需要用到的是onProgressUpdate();在用到onProgressUpdate的時(shí)候,數(shù)據(jù)下載進(jìn)度是從publishProgress傳入;操作代碼如;
問(wèn)題:由于一開(kāi)始的優(yōu)化,對(duì)view,和基本組件的復(fù)用關(guān)系,導(dǎo)致了bug,在上下滑動(dòng)的時(shí)候別的地方?jīng)]有點(diǎn)擊下載,他的ProgressBar中的進(jìn)度條也是顯示滿格。
解決:
如同圖片的一樣,定義容器,用于保存,保存當(dāng)前是否是在下載,下載中,下載成功的三個(gè)狀態(tài),在對(duì)齊做對(duì)應(yīng)的操作,并且與進(jìn)行替換,操作代碼如下:
在這次的模擬手機(jī)助手下載,已經(jīng)基本上都完成了。
文章標(biāo)題:android之模擬手機(jī)助手下載
轉(zhuǎn)載注明:http://m.rwnh.cn/article4/jepioe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、云服務(wù)器、網(wǎng)站排名、建站公司、全網(wǎng)營(yíng)銷推廣、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)