android之模擬手機(jī)助手下載

    在學(xué)習(xí)了javaSE過(guò)后,現(xiàn)在開始繼續(xù)我的android生活,之前學(xué)習(xí)完JavaSE,通過(guò)UI界面做過(guò)模擬游戲《貪吃蛇》和基本版計(jì)算器,現(xiàn)在學(xué)習(xí)Android接近有20天的時(shí)間,開始制作模擬手機(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ù);打造開放共贏平臺(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)和眾多成功案例,為您定制開發(fā)。

    本次需呀用到hfs外部軟件,來(lái)解決網(wǎng)絡(luò)的問(wèn)題,android之模擬手機(jī)助手下載和一些圖片,用于下載時(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);剛開始打開軟件的時(shí)候,一開始顯示整個(gè)頁(yè)面布局,和剛開始我們軟件的圖標(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);這樣,一開始的基本頁(yè)面既可以完成,如圖:

android之模擬手機(jī)助手下載

這些打開軟件的是最基本的顯示,圖標(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 一樣,我們每次有聲明的一開始聲明的

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),

解決:在一開始要下載圖標(biāo),更改圖片之前把圖片先改為我們默認(rèn)的圖片,例如:

myview.p_w_picpath.setImageResource(R.drawable.ic_launcher);

這樣只能解決基本的問(wèn)題,如果一開始只是輕輕滑動(dòng)的話,是不會(huì)出現(xiàn)圖標(biāo)閃變,如果要是一開始的時(shí)候在圖片還在下載的時(shí)候就進(jìn)行快速的上下滑動(dòng)的話,這樣還是會(huì)出現(xiàn)圖片閃跳。我們?cè)谳p輕滑動(dòng)的時(shí)候他view 的替換是有規(guī)律的,但是如果開始滑動(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);

}

以上是打開界面時(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傳入;操作代碼如;

android之模擬手機(jī)助手下載

android之模擬手機(jī)助手下載

android之模擬手機(jī)助手下載

問(wèn)題:由于一開始的優(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)行替換,操作代碼如下:

android之模擬手機(jī)助手下載

android之模擬手機(jī)助手下載

android之模擬手機(jī)助手下載

在這次的模擬手機(jī)助手下載,已經(jīng)基本上都完成了。

文章標(biāo)題:android之模擬手機(jī)助手下載
轉(zhuǎn)載注明:http://muchs.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)

營(yíng)銷型網(wǎng)站建設(shè)