Java java지도 시간 안드로이드 성능 향상을 위한 제안

안드로이드 성능 향상을 위한 제안

Dec 03, 2016 am 09:07 AM
android

앱의 성공이 앱의 성능 경험과 밀접한 관련이 있다는 것은 누구나 알고 있습니다. 하지만 앱이 최고의 성능을 경험하게 하려면 어떻게 해야 할까요? DroidCon NYC 2015의 이 강연에서 Boris Farber는 Android API에 대한 자신의 경험과 몇 가지 일반적인 함정을 피하는 방법을 소개합니다. 시작 시간을 단축하고, 슬라이딩 효과를 최적화하고, 보다 원활한 사용자 경험을 만드는 방법을 알아보세요.

소개

안녕하세요 여러분. 저는 현재 Google에 입사하여 고성능이 필요한 앱을 담당하고 있는 보리스입니다. 이 공유는 제가 오랜 시간 동안 저의 실수와 파트너와의 상담을 통해 축적한 모범 사례입니다. 작은 앱을 가지고 있다면 이 글을 읽으면 앱의 성장 단계에 도움이 될 것입니다.

시작하는 데 시간이 오래 걸리거나, 매끄럽게 슬라이드되지 않거나, 응답하지 않는 앱을 ​​자주 봅니다. 우리는 일반적으로 이러한 문제를 개선하는 데 많은 시간을 소비합니다. 결국 우리 모두는 앱이 성공하기를 원합니다.

Activity Leak

가장 먼저 해결해야 할 문제는 ​​Activity Leak 입니다. 먼저 메모리 누수가 어떻게 발생하는지 살펴보겠습니다. 활동 누수는 일반적으로 메모리 누수 유형입니다. 왜 누출되나요? 사용되지 않은 활동에 대한 참조를 보유하는 경우 실제로 모든 뷰를 포함하는 활동의 레이아웃을 보유하게 됩니다. 가장 까다로운 것은 정적 참조를 유지하는 것입니다. Activity와 Fragment에는 고유한 수명 주기가 있다는 점을 잊지 마세요. 정적 참조를 보유하면 활동 및 조각이 가비지 수집기에 의해 정리되지 않습니다. 이것이 바로 정적 참조가 위험한 이유입니다.

m_staticActivity = staticFragment.getActivity()
로그인 후 복사

이 코드를 너무 많이 봤습니다.

또한 Listener가 유출되는 일도 다반사입니다. 예를 들어 다음 코드가 있습니다. LeakActivity는 Activity에서 상속받습니다. NastyManager라는 싱글톤이 있습니다. addListener(this)를 통해 Activity를 Listener와 NastyManager로 바인딩하면 나쁜 일이 발생합니다.

public class LeakActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NastyManager.getInstance().addListener(this);  
  }  
}
로그인 후 복사

이 버그를 수정하는 방법은 실제로 매우 간단합니다. 활동이 삭제되면 NastyManager에서 바인딩을 해제하면 됩니다.

@Override public void onDestroy() { super.onDestroy();  
  NastyManager.getInstance().removeListener(this);  
}
로그인 후 복사

위의 솔루션과 비교하면 당연히 더 나은 솔루션이 있습니다. 예를 들어, 정말로 싱글톤을 사용해야 할까요? 일반적으로 필요하지 않습니다. 하지만 때로는 정말 필요할 수도 있습니다. 우리는 무게를 재고 디자인해야 합니다. 하지만 무슨 일이 있어도 Activity가 소멸되면 해당 Activity에 대한 참조가 싱글톤에서 제거된다는 점을 기억하세요. 아래에서 논의해 봅시다: 내부 클래스라면 어떻게 될까요? 예를 들어 활동에는 매우 짧은 비정적 핸들러가 있습니다.

짧아 보여도 그것이 살아있는 한, 그것을 담은 활동도 살아있을 것입니다. 믿을 수 없다면 VM에서 시도해 보세요. 이는 메모리 누수의 또 다른 경우입니다. 활동 내부의 핸들러입니다.

public class MainActivity extends Activity { //...  Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 
//...  handler = new Handler() { @Override public void handleMessage(Message msg) {  
              }  
  }  
}
로그인 후 복사

핸들러는 비동기식, 스레드 안전성 등 매우 일반적이고 유용한 클래스입니다. 다음과 같은 코드가 있다면 어떻게 될까요? handler.postDeslayed, 지연 시간이 몇 시간이라고 가정하면... 이것은 무엇을 의미합니까? 즉, 핸들러의 메시지가 처리되지 않은 한 메시지는 항상 활성화되고 이를 포함하는 활동도 활성화됩니다. 이를 해결할 수 있는 방법을 찾아보겠습니다. 바로 Weak Reference라고 불리는 WeakReference입니다. 가비지 수집기는 재활용 시 약한 참조를 무시하므로 해당 참조가 포함된 활동은 정상적으로 정리됩니다. 대략적인 코드는 다음과 같습니다.

요약: Handler와 마찬가지로 내부 클래스가 있습니다. 내부 비정적 클래스는 Android에서 일반적으로 Activity입니다. 따라서 코드의 내부 클래스를 살펴보고 메모리 누수가 없는지 확인하세요.

비정적 내부 클래스보다 정적 내부 클래스를 사용하는 것이 더 좋습니다. 차이점은 정적 내부 클래스는 자신이 속한 클래스에 의존하지 않고 수명 주기가 다르다는 것입니다. 비슷한 이유로 메모리 누수가 발생하는 경우를 자주 봅니다.

활동 유출을 방지하는 방법은 무엇인가요?

移除掉所有的静态引用。
考虑用 EventBus 来解耦 Listener。
记着在不需要的时候,解除 Listener 的绑定。
尽量用静态内部类。
做 Code Review。个人经验:Code Review 能很早的发现内存泄漏。
了解你程序的结构。
用类似 MAT,Eclipse Analyzer,LeakCanary 这样的工具分析内存。
在 Callback 里打印 Log。
로그인 후 복사

스와이프

实现流畅滑动的技巧:UI 线程只用作 UI 渲染。这一条真谛能够解决 99% 的滑动卡顿问题。不要在 UI 线程做下面的事情:

载入图片
网络请求
解析 JSON 读取数据库
로그인 후 복사

做这些操作是很慢的,像图片,网络,JSON考虑用现成的库,有很多社区提供的解决方案,数据库考虑下用 Loader,支持批量更新和载入。

图片

图片相关的库有很多,比如 Glide, Picasso, Fresco。你可以自己去了解下他们之间的区别,以帮助自己在特定场景下做出取舍。

内存

Bitmap 操作是很需要技巧的,图片一般比较大,而且系统对最大内存又有限制和要求。在我面对 4.0 之前的系统的时候,我简直要崩溃了。内存管理也很需要技巧。有的时候需要放到文件里,有的时候需要放到内存里,别忘了,我们还有一个很有用的工具:LRUCache。

网络

首先,Java 的网络请求确实是 Android 的一个阻碍。很多 Java.net 的 API 都是阻断执行的,切记不可在 UI 线程执行网络请求。在线程里执行或者直接使用第三方库吧。

异步 HTTP 其实也挺麻烦的,4.4 起 OkHttp 就成了 Android 代码的一部分了,然而… 如果你需要最新版本的 OkHttp ,可以考虑自己引入。另外有个不错的库叫: Volley,也可以试试 Square 的 Retrofit。这些都能让你的网络请求变得更友好。

大 JSON

在 UI 线程,也不做解析 Json 的事情,因为这是一个很耗时的事情。试着用 Google 的 GSON 来做反序列化的操作。

对于巨大的 JSON 解析,建议用更快的 Jackson 以及 ig-json-parser,这两个工具在 JSON 的解析上做的非常漂亮。从公司的反馈结果来看 ig-json-parser 的效率是最高的。

Looper.myLooper() == Looper.getMainLooper() 是可以帮助你确定你是否在主线程的代码。

如何优化滑动速度?

UI 线程只做 UI 更新。
理解并发 API。
开始使用优秀的第三方库。
使用 Loader 加载数据库数据
로그인 후 복사

之所以要用第三方库,是因为你自己去完善一个复杂功能是需要花时间的。如果你打算专注在自己的功能性的 App 上,那么用库吧。

并发 APIs

如何让 App 快速响应请求是个很重要。开发者们,甚至包括我,经常忘记 Service 的方法是在 UI 线程执行的。请考虑使用 IntentService,AsyncTask,Executors,Handler 和 Loopers。

我们来盘点下这些的区别:

IntentService

我在之前的公司,我用 IntentService 来执行上传功能。IntentService 是一个单线程,一次一个任务的工作流。我们没有很复杂的任务系统。如果你有大型复杂的任务,而且这个任务不需要跟 UI 打交道,那么考虑用 IntentService 吧。

AsyncTask

如果你的任务需要更新 UI,那么考虑用 AsyncTask 吧,AsyncTask 虽然相对容易,但是有些坑得留意。当你旋转手机的时候,Activity 会被关闭,然后重启。不然可能造成内存泄露。

Executor Framework

这是 Java 6 自带的并发方案。默认是存在一个由系统管理的线程池,你可以通过 callback,future 来控制和管理。这根 MapRedues 发难有点像,面对复杂的任务,你希望能够把他们拆分交给多个线程来处理。Executor 的框架就很能胜任这种场景。

如何适应并发APIs?

学会和理解 API,懂得权衡
确保找到了问题的正确解决方案
了解问题真实所在
重构代码
로그인 후 복사

Deprecation

我们肯定都知道,最好能够避免使用废弃的 API。比如以下的例子:

不要通过反射来调用私有 API。
不要再 NDK 和 C 语言层调用私有 Native 方法。
不要轻易调用 Runtime.exec 指令完成进程通讯功能。
adb shell am 做进程通讯并不好。
로그인 후 복사

废弃的意思是这些 API 将会被移除,通常在正式版发布 1,2天左右,你的 App 就不会工作了。更糟糕的情况是,如果你的 App 依赖了一些库,而这些库哟改了废弃的 Api 或者工具。那可就惨了,如果一旦作者没有更新…你懂得。

不要用废弃 Api 的另一个原因是性能问题和安全问题。

如何避免废弃 Api:

使用正确的 API。
重构依赖。
不要滥用系统。
更新依赖和工具。
越新的通常越好。
로그인 후 복사

用 Toolbar 而非 ActionBar,在需要动画的时候用 RecyclerView,因为它专门为动画做过优化。同时 Android M 里移除了 Apache Http Connection。请使用 HttpURLConnection,它拥有更简单的 API,更小的体积,默认的压缩功能,更好的 Response 缓存,等等其他很赞的功能。

架构

架构中的 Bug 总是最为烦人。想要避免这种问题,学习下 App 组件的生命周期。比如什么是 Activity 的 Flag?什么是 Fragment?什么事 stated fragment?什么是 task?读读文档,尝试下用回调的 log 搞清楚这些概念。

时常有人问我:“Picasso 和 Glide 哪个更好?我改用 Volley 还是 OkHttp?”,这种问题根本没有 100% 正确的答案。不过,当我在选择一个库的时候,我会用下面的 Checklist 来决策:

确保它能够解决你的问题。
确保它和当前所有的依赖能正常工作。
检查依赖
留意一下依赖的版本冲突
了解维护情况和成本
로그인 후 복사

总的来说,提及架构和设计,最好的方法就是让你的程序最快响应。确保用户能够快速理解你的 App,并且拥有良好体验。


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

새로운 보고서는 소문난 삼성 갤럭시 S25, 갤럭시 S25 플러스, 갤럭시 S25 울트라 카메라 업그레이드에 대한 비판적인 평가를 제공합니다. 새로운 보고서는 소문난 삼성 갤럭시 S25, 갤럭시 S25 플러스, 갤럭시 S25 울트라 카메라 업그레이드에 대한 비판적인 평가를 제공합니다. Sep 12, 2024 pm 12:23 PM

최근 아이스 유니버스는 삼성의 차기 플래그십 스마트폰으로 널리 알려진 갤럭시 S25 울트라에 대한 세부 정보를 꾸준히 공개해 왔습니다. 무엇보다도 유출자는 삼성이 카메라 업그레이드를 하나만 가져올 계획이라고 주장했습니다.

삼성 갤럭시 S25 울트라, 디자인 변경 루머가 공개된 첫 번째 렌더링 이미지 유출 삼성 갤럭시 S25 울트라, 디자인 변경 루머가 공개된 첫 번째 렌더링 이미지 유출 Sep 11, 2024 am 06:37 AM

OnLeaks는 이제 Android Headlines와 제휴하여 X(이전 Twitter) 팔로어로부터 4,000달러 이상의 수익을 창출하려는 시도가 실패한 지 며칠 후 Galaxy S25 Ultra에 대한 첫 번째 모습을 제공합니다. 맥락에 따라 h 아래에 포함된 렌더링 이미지

IFA 2024 | TCL의 NXTPAPER 14는 성능 면에서는 Galaxy Tab S10 Ultra와 일치하지 않지만 크기에서는 거의 일치합니다. IFA 2024 | TCL의 NXTPAPER 14는 성능 면에서는 Galaxy Tab S10 Ultra와 일치하지 않지만 크기에서는 거의 일치합니다. Sep 07, 2024 am 06:35 AM

TCL은 두 가지 새로운 스마트폰을 발표하는 것과 함께 NXTPAPER 14라는 새로운 Android 태블릿도 발표했는데, TCL의 거대한 화면 크기는 판매 포인트 중 하나입니다. NXTPAPER 14는 TCL의 시그니처 브랜드인 무광택 LCD 패널 버전 3.0을 갖추고 있습니다.

Samsung Galaxy S24 FE는 4가지 색상과 2가지 메모리 옵션으로 예상보다 낮은 가격으로 출시될 예정 Samsung Galaxy S24 FE는 4가지 색상과 2가지 메모리 옵션으로 예상보다 낮은 가격으로 출시될 예정 Sep 12, 2024 pm 09:21 PM

삼성전자는 팬에디션(FE) 스마트폰 시리즈를 언제 업데이트할지 아직 힌트를 주지 않았다. 현재 상태로 Galaxy S23 FE는 2023년 10월 초에 출시된 회사의 최신 버전으로 남아 있습니다.

Vivo Y300 Pro는 7.69mm의 슬림한 본체에 6,500mAh 배터리를 탑재했습니다. Vivo Y300 Pro는 7.69mm의 슬림한 본체에 6,500mAh 배터리를 탑재했습니다. Sep 07, 2024 am 06:39 AM

Vivo Y300 Pro는 방금 완전히 공개되었으며 대용량 배터리를 갖춘 가장 얇은 중급 Android 휴대폰 중 하나입니다. 정확히 말하면 스마트폰의 두께는 7.69mm에 불과하지만 배터리 용량은 6,500mAh입니다. 최근 출시된 것과 동일한 용량이다.

새로운 보고서는 소문난 삼성 갤럭시 S25, 갤럭시 S25 플러스, 갤럭시 S25 울트라 카메라 업그레이드에 대한 비판적인 평가를 제공합니다. 새로운 보고서는 소문난 삼성 갤럭시 S25, 갤럭시 S25 플러스, 갤럭시 S25 울트라 카메라 업그레이드에 대한 비판적인 평가를 제공합니다. Sep 12, 2024 pm 12:22 PM

최근 아이스 유니버스는 삼성의 차기 플래그십 스마트폰으로 널리 알려진 갤럭시 S25 울트라에 대한 세부 정보를 꾸준히 공개해 왔습니다. 무엇보다도 유출자는 삼성이 카메라 업그레이드를 하나만 가져올 계획이라고 주장했습니다.

Xiaomi Redmi Note 14 Pro Plus는 Light Hunter 800 카메라를 탑재한 최초의 Qualcomm Snapdragon 7s Gen 3 스마트폰으로 출시됩니다. Xiaomi Redmi Note 14 Pro Plus는 Light Hunter 800 카메라를 탑재한 최초의 Qualcomm Snapdragon 7s Gen 3 스마트폰으로 출시됩니다. Sep 27, 2024 am 06:23 AM

Redmi Note 14 Pro Plus는 이제 작년 Redmi Note 13 Pro Plus(Amazon에서 현재 $375)의 직접적인 후속 제품으로 공식화되었습니다. 예상대로 Redmi Note 14 Pro Plus는 Redmi Note 14 및 Redmi Note 14 Pro와 함께 Redmi Note 14 시리즈를 주도합니다. 리

iQOO Z9 Turbo Plus: 잠재적으로 강화된 시리즈 플래그십에 대한 예약 시작 iQOO Z9 Turbo Plus: 잠재적으로 강화된 시리즈 플래그십에 대한 예약 시작 Sep 10, 2024 am 06:45 AM

OnePlus의 자매 브랜드 iQOO는 2023-4년 제품 주기가 거의 끝날 수 있습니다. 그럼에도 불구하고 브랜드는 Z9 시리즈가 아직 끝나지 않았다고 선언했습니다. 최종이자 아마도 최고급인 Turbo+ 변형이 예상대로 발표되었습니다. 티

See all articles