1. Java / Говнокод #9256

    +68

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    public class Pages extends TabActivity {
    
    	public static TabHost host;	
           
            @Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		host = getTabHost();
                    // много говнокода
            }
    }
    
    public class Table extends Activity {
    //много говнокода
    
    	@Override
    	protected void onResume() {
    		super.onResume();
    		if (!loading) {
    			loading = true;
    			new MainTask().execute();
    		}
    	}
    
    	private class MainTask extends AsyncTask<Void, String, Void> {
                    //безумнейший парсинг в donInBackground()
    
    		@Override
    		protected void onPostExecute(Void unused) {
                           //разбираемся с тем, что пришло - для начала отлавливаем ошибки в парсере.
    			if (!timeOut) {
    				AlertDialog dlg = new AlertDialog.Builder(TableOfGroups.this).setTitle(Data.lowConnectionTitle)
    						.setMessage(Data.lowConnectionText).setOnCancelListener(new DialogInterface.OnCancelListener() {
    							@Override
    							public void onCancel(DialogInterface dialog) {
    								loading = false;
    								if (!update) {
    									Pages.host.setCurrentTab(Data.savePageIndex - 1);
    								}
    							}
    						}).setPositiveButton("OK", new DialogInterface.OnClickListener() {
    							@Override
    							public void onClick(DialogInterface dialog, int whichButton) {
    								loading = false;
    								if (!update) {
    									Pages.host.setCurrentTab(Data.savePageIndex - 1);
    								}
    							}
    						}).create();
    				dlg.show();
    				if (!update)
    					return;
    			}
                            //ещё около 150 строк подобной ловли
                    }
            }
    }

    Задача (Android): имеется активити со вкладками (Pages), внутри него - дочерние активити. Если в активити Table на 4-й вкладке происходит косяк, то нужно показать диалог и перепрыгнуть на 1-ю вкладку.

    Запостил: QuickNick, 30 Января 2012

    Комментарии (19) RSS

    • Пардоньте.
      Хотел название класса поменять, но при передаче в AlertDialog.Builder() забыл :)
      Ответить
    • TypicalClass.java
      Ответить
    • TabHost порадовал - хочу своего личного вкладконосителя!
      Ответить
      • Ошибка становится особо пикантной, если вспомнить, что TabHost (сам по себе не маленький) ещё и хранит ссылку на проинициализировавший его Context (в данном случае, Pages), а внутри Pages - чёртова уйма внутренних классов и LocalActivityManager, внутри которого массив контроллеров (Activity) каждой вкладки, каждый из которых, в свою очередь, тянет за собой огромные вьюхи (товарищ верстал совершенно сумасшедшие неоптимизированные лейауты) и внутренние классы-модели.

        Утечка памяти при выходе из приложения решается посредством System.exit(0);
        Ответить
        • Утечка памяти в java?
          Ответить
          • Да, в Яве при некоторой кривизне рук вполне можно устроить масштабную утечку памяти.
            http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
            Ответить
            • Так это не в java, а в android. И вообще я бы не назвал это утечками.
              Ответить
              • А Андроид на инопланетной Яве, что ли?
                Ответить
                • Может пойдем дальше и скажем, что утечки памяти в модулях ОЗУ? Они вроде бы тоже не инопланетные.
                  Ответить
                  • Ниже уже описали ситуацию, как можно так написать приложение, что сборщик мусора просто не соберёт ненужные объекты.
                    Ответить
          • запросто. например, создать сложную форму на свинке, назначить слушателей, и удалить форму, забыв перед этим разрегистрировать слушатели.
            в результате форма целиком несобираема мусорщиком.
            случай сложнее - перезагрузка классов (байткод). поскольку у каждого Class есть ссылка на его ClassLoader, то рано или поздно получим OutOfMemoryError: PermGen space. С этим довольно трудно бороться, и этим страдают практически все фреймворки с live class reloading
            Ответить
            • А автодеструкторов для разрегистрации слушателей не придумали.
              Какой стыд...
              Ответить
              • В жабе слово "авто" противоречит идеологии, ведь индусы не могут "авто", так кода меньше получается.
                Ответить
                • А ГЦ не противоречит?
                  Ответить
                  • Это единственная поблажка, чтобы индусы своим быдлокодом не ломали систему.
                    Ответить
              • ты не поверишь, в жабке вообще нет деструкторов
                Ответить
        • > Утечка памяти при выходе из приложения
          решается посредством System.exit (0 );

          php-style...
          Ответить
          • нет в php это or die(); что означает умри сука.
            Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий