日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

CSDN移動(dòng)將持續(xù)為您優(yōu)選移動(dòng)開(kāi)發(fā)的精華內(nèi)容,共同探討移動(dòng)開(kāi)發(fā)的技術(shù)熱點(diǎn)話(huà)題,涵蓋移動(dòng)應(yīng)用、開(kāi)發(fā)工具、移動(dòng)游戲及引擎、智能硬件、物聯(lián)網(wǎng)等方方面面。如果您想投稿、參與內(nèi)容翻譯工作,或?qū)で蠼硤?bào)道,請(qǐng)發(fā)送郵件至tangxy#csdn.net(請(qǐng)把#改成@)。

我的第一個(gè)應(yīng)用非常糟糕。事實(shí)上,它糟糕得以致于我從應(yīng)用市場(chǎng)上刪除它,同時(shí)我甚至都不會(huì)在我的簡(jiǎn)歷上羅列出它。如果我在開(kāi)發(fā)之前能夠知道一些Android開(kāi)發(fā)的事情,也不會(huì)糟糕到這步田地。

本文中所羅列的事情是你在開(kāi)發(fā)第一個(gè)Android應(yīng)用的時(shí)候需要牢記在大腦中的。我接下來(lái)將展示的實(shí)際錯(cuò)誤均來(lái)自于我的第一個(gè)應(yīng)用程序代碼中。把這些錯(cuò)誤經(jīng)驗(yàn)牢記心頭能夠幫助你開(kāi)發(fā)一個(gè)讓你引以為豪的應(yīng)用。

當(dāng)然,正如Code Standards所說(shuō):如果你所做的工作和你作為學(xué)生開(kāi)發(fā)的Android應(yīng)用類(lèi)似,你很有可能會(huì)討厭你的應(yīng)用。

如果一年前你寫(xiě)的代碼對(duì)于你來(lái)說(shuō)感覺(jué)還不錯(cuò),你很大程度上沒(méi)有進(jìn)行足夠的學(xué)習(xí)。 
——Code Standards 2015.5.21

如果你是一位經(jīng)驗(yàn)豐富的JAVA開(kāi)發(fā)者,第1、2、5條很有可能對(duì)你沒(méi)有吸引力。另一方面,即使你從來(lái)沒(méi)有犯過(guò)這些例子中的錯(cuò)誤,第3、4條也可能向你展示一些很酷的事物,你可以利用一款也許你不知道的軟件——Android Studio去實(shí)現(xiàn)這些事物。

 

1. 不要持有Context的靜態(tài)引用

public class MainActivity extends LocationManagingActivity implements ActionBar.OnNavigationListener,
    googlePlayServicesClient.ConnectionCallbacks,
    GooglePlayServicesClient.OnConnectionFailedListener {
    //...
    private static MeTrackerStore mMeTrackerStore; 
    //...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //...
        mMeTrackerStore = new MeTrackerStore(this);
    }
}

這對(duì)于每個(gè)人來(lái)說(shuō)看似是一個(gè)不可能犯的錯(cuò)誤。但事實(shí)卻并非如此,我犯了這個(gè)錯(cuò)誤,我也看到過(guò)別人犯這個(gè)錯(cuò)誤,同時(shí)我也采訪(fǎng)過(guò)那些不能很快指出為什么這是放在第一位的錯(cuò)誤的人。不要這樣做,它是會(huì)變的。

如果MeTrackerStore通過(guò)它的構(gòu)造函數(shù)保持一個(gè)指向Activity的引用,這個(gè)Activity將不會(huì)被垃圾回收(GC),除非靜態(tài)變量被從新分配到不同的Activity。這是因?yàn)閙MeTrackerStore是靜態(tài)變量,而靜態(tài)變量的內(nèi)存是不會(huì)被回收,直到應(yīng)用程序退出才回收。如果你正在試圖做這樣的事情,你的代碼很有可能有嚴(yán)重的錯(cuò)誤。尋找?guī)椭桑赡芸纯碐oogle的Udacity課程“Android Development for Beginners”能夠幫助你。

注:從技術(shù)上說(shuō),你可以對(duì)一個(gè)Application Context進(jìn)行靜態(tài)變量引用而不引起內(nèi)存泄露,但我不建議你這樣做。

 

2. 注意那些你無(wú)法控制生命周期的對(duì)象的隱式引用

public class DefineGeofenceFragment extends Fragment {
    public class GetLatAndLongAndUpdateMapCameraAsyncTask extends AsyncTask<String, Void, LatLng> {

        @Override
        protected LatLng doInBackground(String... params) {
            //...
            try {
                //Here we make the http request for the place search suggestions
                httpResponse = httpClient.execute(httpPost);
                HttpEntity entity = httpResponse.getEntity;
                inputStream = entity.getContent;
                //..
            }
        }
    } 
}

這段代碼有很多問(wèn)題,但我現(xiàn)在只會(huì)把重點(diǎn)問(wèn)題放在“隱式引用”那些問(wèn)題上。在Java中,(非靜態(tài))內(nèi)部類(lèi)有個(gè)對(duì)外部類(lèi)實(shí)例有個(gè)隱式引用。

在這個(gè)例子中,任何GetLatAndLongAndUpdateCameraAsyncTask都有一個(gè)外部類(lèi)DefineGeofenceFragment的引用。對(duì)于匿名類(lèi)是同樣的,它們也有一個(gè)對(duì)包含它們的類(lèi)的實(shí)例的一個(gè)隱式引用。

GetLatAndLongAndUpdateCameraAsyncTask對(duì)生命周期我們無(wú)法控制的Fragment對(duì)象有一個(gè)隱式引用。Android SDK負(fù)責(zé)創(chuàng)建和銷(xiāo)毀Fragment,如果GetLatAndLongAndUpdateCameraAsyncTask 因?yàn)檎谶\(yùn)行而不能被垃圾回收,那么DefineGeofenceFragment也將因?yàn)榫哂须[式引用而保留不能被垃圾回收。

這里有一個(gè)很棒的Google視頻,解釋它為什么會(huì)發(fā)生這種事情(友情提示:需自備梯子哈)。

 

3. 使用Android Studio進(jìn)行工作

public ViewPager getmViewPager {
    return mViewPager;
}

這段代碼是我使用“Generate Getter”在Android Studio中進(jìn)行生成的。這些getter保持了’m’前綴的實(shí)例變量,同樣通過(guò)它也能為一個(gè)方法產(chǎn)生相同的效果,這已經(jīng)不是空想。

(如果你想知道為什么’m’是實(shí)例變量的名稱(chēng)的第一個(gè)字母,’m’往往是實(shí)例變量的公認(rèn)約定。它代表了’member'(成員)的意思)。

不管你是否認(rèn)為實(shí)例變量的前綴’m’是一個(gè)好注意,在這有一個(gè)知識(shí),Android Studio能夠幫助你編寫(xiě)任何你想要實(shí)現(xiàn)的公認(rèn)約定。例如,在你為實(shí)例變量生成getters、setters和connstructor參數(shù)時(shí),你可以使用Android Studio代碼風(fēng)格對(duì)話(huà)框的設(shè)置使Android Studio在你的實(shí)例變量前自動(dòng)添加’m’和移除’m’。

開(kāi)發(fā)第一個(gè)Android應(yīng)用之前你需要知道的六件事

Android Studio能夠做的遠(yuǎn)不止于此。學(xué)習(xí)Android Studio從學(xué)習(xí)快捷鍵和模版是不錯(cuò)的開(kāi)始。

 

4. 一個(gè)函數(shù)只做一件事

在我寫(xiě)的眾多類(lèi)中,有一個(gè)類(lèi)的一個(gè)方法我便寫(xiě)了有100多行。這類(lèi)的方法是非常難以讀懂、修改和重用,努力讓一個(gè)方法只做一件事情。顯然,這意味著你應(yīng)該對(duì)超過(guò)20行的方法持有懷疑態(tài)度。這里,你可以使用Android Studio來(lái)幫助你發(fā)現(xiàn)有問(wèn)題的方法:

開(kāi)發(fā)第一個(gè)Android應(yīng)用之前你需要知道的六件事

 

5. 向聰明和有經(jīng)驗(yàn)的人學(xué)習(xí)

這可能聽(tīng)起來(lái)微不足道,但是這是我開(kāi)發(fā)第一個(gè)應(yīng)用時(shí)候犯下的錯(cuò)誤。

當(dāng)你開(kāi)發(fā)一個(gè)應(yīng)用的時(shí)候,你會(huì)犯別人已經(jīng)犯過(guò)的錯(cuò)誤。向別人學(xué)習(xí),你可以避免犯別人犯過(guò)的錯(cuò)誤來(lái)節(jié)約你的時(shí)間。我在我的第一個(gè)應(yīng)用中浪費(fèi)了大量的時(shí)間去犯錯(cuò),這些錯(cuò)誤如果我花點(diǎn)時(shí)間向有經(jīng)驗(yàn)的軟件開(kāi)發(fā)工程師學(xué)習(xí)就可以避免。

閱讀Pragmatic Programmer,然后閱讀Effective Java。這兩本書(shū)會(huì)幫助你避免開(kāi)發(fā)新手常犯的錯(cuò)誤。在你學(xué)習(xí)了這兩本書(shū)后,不停地尋找聰明的人并向他們學(xué)習(xí)。

 

6. 使用類(lèi)庫(kù)

當(dāng)你開(kāi)發(fā)應(yīng)用的時(shí)候,你可能會(huì)遇到一些聰明人和有經(jīng)驗(yàn)人已經(jīng)解決過(guò)的問(wèn)題。而且,許多這些問(wèn)題的解決方案是可以作為開(kāi)源庫(kù)的,充分利用它們。

在我的第一個(gè)應(yīng)用中,我寫(xiě)了一些類(lèi)庫(kù)已經(jīng)提供的功能代碼。其中一些是Java標(biāo)準(zhǔn)庫(kù),還有一些是第三方類(lèi)庫(kù),如Retrofit和Picasso。如果你不確定你使用什么樣的類(lèi)庫(kù),你可以做下面3件事情:

  1. 聽(tīng)Google IO Fragmented廣播。在這期間,詢(xún)問(wèn)這些開(kāi)發(fā)者什么第三方類(lèi)庫(kù)類(lèi)庫(kù)對(duì)Android很重要。
  2. 訂閱Android周刊。這里包含了一部分最新的類(lèi)庫(kù),時(shí)刻注意哪些對(duì)自己有用。
  3. 尋找那些能夠解決與你在開(kāi)發(fā)應(yīng)用中遇到問(wèn)題類(lèi)似的開(kāi)源應(yīng)用。你可能發(fā)現(xiàn)某個(gè)應(yīng)用使用的第三方類(lèi)庫(kù)就是你想要的,或者你會(huì)發(fā)現(xiàn)一個(gè)你所不知道的Java類(lèi)庫(kù)。

 

總結(jié)

開(kāi)發(fā)優(yōu)秀的Android應(yīng)用是非常困難的,不要用重蹈覆轍來(lái)難為自己。如果你發(fā)現(xiàn)我寫(xiě)的代碼中的錯(cuò)誤請(qǐng)?jiān)谠u(píng)論中告訴我。(誤導(dǎo)性評(píng)論比沒(méi)有評(píng)論更糟糕)。如果你認(rèn)為這篇文章對(duì)于新手開(kāi)發(fā)者有用,請(qǐng)分享它,以解決他們的一些令人頭疼的難題。

分享到:
標(biāo)簽:Android
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定