Android Studio提供了很好的重構項目。 但是何時做「將匿名轉換爲內部」更好?何時使用「將匿名轉換爲內部」重構?
例如:
new Thread(new MyRunnable());
private static class MyRunnable implements Runnable {
@Override
public void run() {
// do something
}
}
Android Studio提供了很好的重構項目。 但是何時做「將匿名轉換爲內部」更好?何時使用「將匿名轉換爲內部」重構?
例如:
new Thread(new MyRunnable());
private static class MyRunnable implements Runnable {
@Override
public void run() {
// do something
}
}
據我所知,應該使用靜態方法來避免Memory Leak
。例如:
new Thread(new Runnable() {
@Override
public void run() {
// do something long here
YourActivity.this.doSomething();
}
})
- >當線程運行時關閉應用程序時,上述代碼將使您的應用程序出現內存泄漏錯誤。 然而,隨着新的重構就可以避免內存泄漏很容易:
private static class MyRunnable implements Runnable {
WeakReference<YourActivity> activity;
@Override
public void run() {
// do something long
if(activity.get() != null){
activity.get().doSomething();
}
}
}
Wouldn'將線程與活動生命週期簡單地同步會更好嗎?在我看來,一個活動的實例離開onDestroy(或者甚至onPause,取決於它的作用),一個與活動關聯的線程不應該運行。 – CurlyCorvus
@CurlyCorvus是的,但是當它運行時你不能從外面停止線程。然後,線程仍然持有你的活動的一個實例,直到線程完成 - >內存泄漏仍然發生。 –
http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java你可以,一個很好的方法是在http://stackoverflow.com/questions/ 3696506 /怎麼就殺,一個線程和處理程序,之前持續到新的活動。 – CurlyCorvus
這是很容易創建一個內部類的多個實例(通過調用它的構造函數)比創建一個匿名的幾個實例:
new Thread(new Runnable() {
@Override
public void run() {
// do something
}
})
重構後類。
一個更容易回答的問題是How are Anonymous (inner) classes used in Java?,簡而言之,要麼快速實現一個接口(或抽象類),而不要爲接口(或抽象類)增加許多功能,而要想獲得強類型的子類另一類將定期建造。
接口/抽象類的一個很好的例子,你通常想要使用匿名內部類是Runnables和大多數Listener接口,因爲它們只作爲一個代碼片段的「給定」給另一個實例類。內部類的好例子是Android或自定義控件中的碎片(Android中的視圖),儘管將這些重構爲單獨的類可以使它們更加可重用。
如果答案是「是」,而不是使用非匿名內部類,那麼一個快速而骯髒的測試是「我是否需要爲我的內部類創建我自己的構造函數?」。
唯一不同的是內當是靜態的......在這種情況下,不保存引用外部類......我敢肯定,如果你在'run'中使用外部類的方法/字段,它將不會生成靜態類...另一方面,您可以重用這樣的類(當然,如果僅使用它一次,它將不適用) – Selvin