powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / AndroidAnnotations
41 сообщений из 41, показаны все 2 страниц
AndroidAnnotations
    #39171975
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, стоит чуть подробнее для начинающих описать, что это такое, как это едят и какие возможности в связи с применением аннотаций открываются.

Сайт http://androidannotations.org/

На самом сайте дано следующее описание:
Code Diet
AndroidAnnotations is an Open Source framework that speeds up Android development. It takes care of the plumbing , and lets you concentrate on what's really important. By simplifying your code, it facilitates its maintenance .

Грубо переведя, это фреймворк, который позволяет ускорить процесс разработки и повысить читаемость кода.

Пример исходного кода:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
public class BookmarksToClipboardActivity extends Activity {
  
  BookmarkAdapter adapter;
 
  ListView bookmarkList;
 
  EditText search;
 
  BookmarkApplication application;
 
  Animation fadeIn;
 
  ClipboardManager clipboardManager;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN);
 
    setContentView(R.layout.bookmarks);
 
    bookmarkList = (ListView) findViewById(R.id.bookmarkList);
    search = (EditText) findViewById(R.id.search);
    application = (BookmarkApplication) getApplication();
    fadeIn = AnimationUtils.loadAnimation(this, anim.fade_in);
    clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
 
    View updateBookmarksButton1 = findViewById(R.id.updateBookmarksButton1);
    updateBookmarksButton1.setOnClickListener(new OnClickListener() {
 
      @Override
      public void onClick(View v) {
        updateBookmarksClicked();
      }
    });
 
    View updateBookmarksButton2 = findViewById(R.id.updateBookmarksButton2);
    updateBookmarksButton2.setOnClickListener(new OnClickListener() {
 
      @Override
      public void onClick(View v) {
        updateBookmarksClicked();
      }
    });
 
    bookmarkList.setOnItemClickListener(new OnItemClickListener() {
 
      @Override
      public void onItemClick(AdapterView<?> p, View v, int pos, long id) {
        Bookmark selectedBookmark = (Bookmark) p.getAdapter().getItem(pos);
        bookmarkListItemClicked(selectedBookmark);
      }
    });
 
    initBookmarkList();
  }
 
  void initBookmarkList() {
    adapter = new BookmarkAdapter(this);
    bookmarkList.setAdapter(adapter);
  }
 
  void updateBookmarksClicked() {
    UpdateBookmarksTask task = new UpdateBookmarksTask();
 
    task.execute(search.getText().toString(), application.getUserId());
  }
  
  private static final String BOOKMARK_URL = //
  "http://www.bookmarks.com/bookmarks/{userId}?search={search}";
  
  
  class UpdateBookmarksTask extends AsyncTask<String, Void, Bookmarks> {
 
    @Override
    protected Bookmarks doInBackground(String... params) {
      String searchString = params[0];
      String userId = params[1];
 
      RestTemplate client = new RestTemplate();
      HashMap<String, Object> args = new HashMap<String, Object>();
      args.put("search", searchString);
      args.put("userId", userId);
      HttpHeaders httpHeaders = new HttpHeaders();
      HttpEntity<Bookmarks> request = new HttpEntity<Bookmarks>(httpHeaders);
      ResponseEntity<Bookmarks> response = client.exchange( //
          BOOKMARK_URL, HttpMethod.GET, request, Bookmarks.class, args);
      Bookmarks bookmarks = response.getBody();
 
      return bookmarks;
    }
 
    @Override
    protected void onPostExecute(Bookmarks result) {
      adapter.updateBookmarks(result);
      bookmarkList.startAnimation(fadeIn);
    }
    
  }
 
  void bookmarkListItemClicked(Bookmark selectedBookmark) {
    clipboardManager.setText(selectedBookmark.getUrl());
  }
 
}



И то, что получается, после применения androidannotations:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
@NoTitle
@Fullscreen
@EActivity(R.layout.bookmarks)
public class BookmarksToClipboardActivity extends Activity {
  
  BookmarkAdapter adapter;
  
  @ViewById
  ListView bookmarkList;
 
  @ViewById
  EditText search;
  
  @App
  BookmarkApplication application;
  
  @RestService
  BookmarkClient restClient;
 
  @AnimationRes
  Animation fadeIn;
  
  @SystemService
  ClipboardManager clipboardManager;
 
  @AfterViews
  void initBookmarkList() {
    adapter = new BookmarkAdapter(this);
    bookmarkList.setAdapter(adapter);
  }
  
  @Click({R.id.updateBookmarksButton1, R.id.updateBookmarksButton2})
  void updateBookmarksClicked() {
    searchAsync(search.getText().toString(), application.getUserId());
  }
  
  @Background
  void searchAsync(String searchString, String userId) {
    Bookmarks bookmarks = restClient.getBookmarks(searchString, userId);
    updateBookmarks(bookmarks);
  }
 
  @UiThread
  void updateBookmarks(Bookmarks bookmarks) {
    adapter.updateBookmarks(bookmarks);
    bookmarkList.startAnimation(fadeIn);
  }
  
  @ItemClick
  void bookmarkListItemClicked(Bookmark selectedBookmark) {
    clipboardManager.setText(selectedBookmark.getUrl());
  }
 
}
@Rest("http://www.bookmarks.com")
public interface BookmarkClient {
  
  @Get("/bookmarks/{userId}?search={search}")
  Bookmarks getBookmarks(String search, String userId);
 
}



Как подключить (актуально для android studio 1.5.1):
1. В build.gradle проекта добавить зависимость:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'

        // добавить следующую строку
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}


2. В build.gradle модуля добавить следующие строки:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
apply plugin: 'com.android.application'
// все, что ниже
apply plugin: 'android-apt'

apt {
    arguments {
        resourcePackageName android.defaultConfig.applicationId
        androidManifestFile variant.outputs[0]?.processResources?.manifestFile

        // If you're using Android NBS flavors you should use the following line instead of hard-coded packageName
        // resourcePackageName android.defaultConfig.packageName

        // You can set optional annotation processing options here, like these commented options:
        // logLevel 'INFO'
        // logFile '/var/log/aa.log'
    }
}


И это (версия 3.3.2 актуальна на момент написания этого сообщения):
Код: sql
1.
2.
3.
4.
5.
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    apt "org.androidannotations:androidannotations:3.3.2"
    compile "org.androidannotations:androidannotations-api:3.3.2"
}



После этих нехитрых манипуляций можно писать лаконичный код.
Так выглядит рабочий код пустой активности:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
package ru.wadman.reference;

import android.app.Activity;

import org.androidannotations.annotations.EActivity;

@EActivity(R.layout.activity_main2)
public class Main2Activity extends Activity {

}



Основные ключевые слова:
@EActivity - подключает и инициализирует layout активности.
@OptionsMenu - указывает меню для активности.
@ViewById - подключает любую активность (контрол) с id к переменной.
@AfterViews - метод, который выполняется, когда все вью созданы и подключены к ранее объявленным переменным.
@Background - метод, который будет выполняться в дополнительном потоке (фоновая задача).
@UiThread - метод, который будет выполняться в основном потоке. Применяется после @Background.
@Extra - переменная, которая будет сохранена между сеансами активности. Например, после смены ориентации экрана.
@TextChange - метод-обработчик, который будет вызываться при изменении текста.
@Click - метод-обработчик, который вызывается при клике на кнопку, галочку и т.п.
@OptionsItem - метод-обработчик при выборе пункта меню.

Это очень краткий список аннотаций.
С полным списком можно ознакомиться тут: https://github.com/excilys/androidannotations/wiki/AvailableAnnotations

--- добавлено 02.03.2016
Пример исходного кода нового проекта, созданного в студии 1.5.1 с BlankActivity
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
package ru.wadman.test;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}



Тот же функционал, но уже через AndroidAnnotations:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
package ru.wadman.purse;

import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.OptionsItem;
import org.androidannotations.annotations.OptionsMenu;
import org.androidannotations.annotations.ViewById;

@EActivity(R.layout.activity_main)
@OptionsMenu(R.menu.menu_main)
public class MainActivity extends AppCompatActivity {

    @ViewById(R.id.textView)
    TextView textView;
    @ViewById(R.id.fab)
    FloatingActionButton fab;
    @ViewById(R.id.toolbar)
    Toolbar toolbar;

    @AfterViews
    void init() {
        setSupportActionBar(toolbar);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @OptionsItem(R.id.action_settings)
    void optionSettings() {
        Snackbar.make(textView, "Settings selected", Snackbar.LENGTH_LONG).setAction("Action", null).show();
    }

}

...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172067
pand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Большое спасибо за обзор ,
очень полезная технология.

а перечень граблей гдето можно найти ?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172081
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pandа перечень граблей гдето можно найти ?
Из граблей я встречал только это: https://habrahabr.ru/post/154851/#comment_5322429
Интересная библиотека.

Немного смутила ситуация с инъекциями. Например тот же @ViewById задекларированный в классе помеченным @EBean незаметно потащит за собой весь контекст, что может привести к утечке памяти при потери бдительности (а библиотека как раз этому способствует).

Она не лишена недостатков, однако при осторожном использовании позволит избавится от бойлерплейтного кода который уже так надоел мне.

Это похоже на правду. По меньшей мере было, когда была версия меньше 3-х.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172100
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, возможно не все знают - суфикс генерируемых классов можно менять с _ на что-то свое с помощью аргумента classSuffix. также можно менять пакет, финальность класса и кое чего еще https://github.com/excilys/androidannotations/wiki/CustomizeAnnotationProcessing
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172102
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaсуфикс генерируемых классов можно менять с _
Да, кстати, упустил эту деталь: если суффикс не менять, то в манифесте вместо MainActivity нужно будет прописать MainActivity_ и т.п.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172197
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Года 2 назад изучал эту технологию "ускоренного кодинга". Но применять не стал - читаемость кода намного хуже.
Может кто клепает проекты десятками тому и пригодится для ускорения набивки кода. Android Studio и так все делает сама за меня так что хватает пока ее :)
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172206
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийГода 2 назад изучал эту технологию "ускоренного кодинга". Но применять не стал - читаемость кода намного хуже.
в каком месте она становится хуже?


Микола ПитерскийAndroid Studio и так все делает сама за меня так что хватает пока ее :)
например что она делает за тебя?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172222
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийAndroid Studio и так все делает сама за меня так что хватает пока ее :)
Шутишь, да? Как только студия научится определять тяжелый код и автоматом его выносить в отдельный поток - соглашусь. Загляни на страницу аннотаций - удивишься, сколько можно сократить времени на кодинг.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172264
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все хочу попробовать,
но как от руки не доходят


просто актуально для однотипных фрагментов.
где незначительная часть отличается, пока наследованием обхожу.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172266
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помню конкретно - но какие-то косяки там были. Может с отладкой проблемы или студия не умеет сама код аннотации завершать или еще что-то.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172272
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийМожет с отладкой проблемы или студия не умеет сама код аннотации завершать или еще что-то.
Ни с тем, ни с другим не испытывал проблем. Использую года 3.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172273
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot chpashaМикола ПитерскийAndroid Studio и так все делает сама за меня так что хватает пока ее :)
например что она делает за тебя?[/quot]

Ты наверное Delphi никогда не пробовал раз так говоришь, если кодинг в Android Studio для меня праздник - то на IDE Delphi я уже спокойно смотреть не могу - так и хочется матюкнуться. Это действительно тупая деревяшка, которая ничего не умеет, ничего не знает и не хочет учиться и которая от версии к версии становится все хуже.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172289
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола Питерскийкодинг в Android Studio для меня праздник - то на IDE Delphi я уже спокойно смотреть не могу
Я тебя понимаю. :) Но можно сделать еще лучше... И тема этому посвящена.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172294
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийНе помню конкретно - но какие-то косяки там были. Может с отладкой проблемы или студия не умеет сама код аннотации завершать или еще что-то.
оно генерит обыкновенный ява-код, примерно такой-же, какой пришлось бы писать руками. какие могут быть проблемы с отладкой или "завершением" аннотаций (что бы это не значило)?

Микола ПитерскийТы наверное Delphi никогда не пробовал раз так говоришь
ты не представляешь, сколько всего я пробовал. только я не понимаю какая связь между Android Studio и android annotations кроме слова "android"? твоя фраза имеет примерно столько же смысла как и "я не пользуюсь дезодорантом - меня вязанные носки устраивают".
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172311
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок - убедили. Пока пару месяцев матюкаюсь с делфи, а как вернусь на андроид - обязательно еще раз попробую.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172852
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а c аннотациями в RecyclyView - ViewHolder да и других адаптерах?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172862
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джибса c аннотациями в RecyclyView - ViewHolder да и других адаптерах?
Не понял вопроса.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172868
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я про

class ViewHolder extends RecyclerView.ViewHolder {
....
}
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172888
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джибсclass ViewHolder extends RecyclerView.ViewHolder
Вроде нет.
Да и не совсем представляю, что там заинжектить можно... Описание холдера?
Или где-то уже что-то подобное реализовано?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173099
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanВроде нет.
Да и не совсем представляю, что там заинжектить можно... Описание холдера?
Или где-то уже что-то подобное реализовано?

когда сложная структура, много элементов во вьюшке, и ее нужно заполнить

приходится та-же рутина в духе findViewById ...
потом view.settext(...);


с другой стороны здесь сложнее.

у меня до 5 разных видов вьюшек в списке бывает
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173125
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джибсприходится та-же рутина в духе findViewById ...
потом view.settext(...);
Думаю, что тот же ViewById должен сработать так или иначе.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173218
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, с холдерами эта фишка скорее всего не сработает. они ищут контролы через контекст, а их в нем скорее всего не будет. но вот что можно сделать, так это дописать свою аннотацию и генератор (или запостить фича-реквест) чтобы в конструктор холдерa передавать вьюху, а не контекст. а дальше уже генерить findViewById. но на данный момент из коробки адаптеры остаются кажется единственным местом где приходится писать говнокод вида findViewById
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173281
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaэто дописать свою аннотацию и генератор
В четверке будут плагины. Во заживем!
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173303
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanchpashaэто дописать свою аннотацию и генератор
В четверке будут плагины. Во заживем!
да будет удобно. хотя я уже давно форкнул и свою версию пилю, но с плагинами будет действительно круче.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173658
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а глуппый вопрос,
аннотации. на скорость как влияют,

или это настолько незначительно, что можно пренебречь ?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173749
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джибсаннотации. на скорость как влияют,
Считай это макросами. Как-бы ты сам писал, но много работы сделали за тебя.
Присутствует некоторая избыточность (она в основном в подготовке вьюхи), но на мой взгляд не значительная.

ViewById:
Код: java
1.
2.
3.
4.
        cbActive = ((CheckBox) hasViews.findViewById(id.cbActive));
        radioSilence = ((RadioButton) hasViews.findViewById(id.radioSilence));
        radioAllow = ((RadioButton) hasViews.findViewById(id.radioAllow));
        buttonOk = ((Button) hasViews.findViewById(id.buttonOk));



Background:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 @Override
    public void showMessages() {
        handler_.post(new Runnable() {


            @Override
            public void run() {
                MessagesActivity_.super.showMessages();
            }

        }
        );
    }
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173984
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джибса глуппый вопрос,
аннотации. на скорость как влияют,

или это настолько незначительно, что можно пренебречь ?
никак не влияет - никакой рефлексии и т.д.. гугли что такое annotation processing. в двух словах, на этапе компиляции генерятся новые классы-наследники, в которых запрятан весь спагетти-код типа findViewById., работа с потоками и всякие приятные мелочи типа автоматичеких (onSaveInstanceState/OnRestoreInstanceState), аргументы, экшены и т.д. Т.е. ты в манифест пишешь не MyActivity, а MyActivity_ (extends MyActivity) и стартуешь ее MyActivity_.intent().start() - кодить при этом продолжаешь в MyActivity.
там куча всего разного - просто полистай https://github.com/excilys/androidannotations/wiki/AvailableAnnotations и почитай что они делают

Имхо must have для ЛЮБОГО проекта.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39174343
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, я просто думал, что там много на рефлексиях.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39174351
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДжибсОк, я просто думал, что там много на рефлексиях.
там ее нет вовсе. вернее есть на этапе компиляции. в рантайме нет
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39188735
ыудусе
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС, добавьте, наверное, в старттопик

Этот вариант
Код: java
1.
        androidManifestFile variant.outputs[0].processResources.manifestFile



может вызывать ошибку:

Код: java
1.
Error:(7, 0) Cannot get property 'processResources' on null object



Лечится вот так:

Код: java
1.
        androidManifestFile variant.outputs[0]?.processResources?.manifestFile



https://github.com/excilys/androidannotations/issues/1606
https://github.com/excilys/androidannotations/wiki/Building-Project-Gradle
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39188741
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ыудусеможет вызывать ошибку:
Не только эту, но при той конфигурации, что я указал (с теми версиями в зависимостях), ошибок не будет.

Если брать последние apt и gradle то да, ошибки есть. У меня вылезла "Cant open file".

Поправлю, спасибо.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39204040
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вышла 4-я версия, убежал читать, что новенького
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39220970
ыудусе
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно как нибудь заиньектить абстрактный бин с реализацией абстрактного метода?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39220979
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ыудусеА можно как нибудь заиньектить абстрактный бин с реализацией абстрактного метода?
что за бредовый вопрос?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39221022
ыудусе
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaчто за бредовый вопрос?

Почему бредовый?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39221066
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ыудусеchpashaчто за бредовый вопрос?

Почему бредовый?
Потому что в нем не прослеживается смысла. Ну т.е. ты-то знаешь, о чем говоришь и сейчас видимо искренне удивлен, но вот я из твоего вопроса нихрена не понял. Начиная с "можно ли заинжектить". АА не занимается вопросами dependency injection
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39221110
ыудусе
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaПотому что в нем не прослеживается смысла. Ну т.е. ты-то знаешь, о чем говоришь и сейчас видимо искренне удивлен, но вот я из твоего вопроса нихрена не понял. Начиная с "можно ли заинжектить". АА не занимается вопросами dependency injection

А это что?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@EActivity
public class MyActivity extends Activity {

    /* A MyImplementation instance will be injected. 
     * MyImplementation must be annotated with @EBean and implement MyInterface.
     */
    @Bean(MyImplementation.class)
    MyInterface myInterface;

}



отсюда
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39221176
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ыудусеА это что?
это фигня в стиле "почти беременна". какой смысл писать интерфейс и тут же по месту указывать, что вместо него будет класс А.
настоящая Dependency Injection это когда ты в конфигурации указываешь реализацию
Код: java
1.
bind(MyInterface.class).to(MyInterfaceImplementationWithAA.class) 



а в коде у тебя зависимость только от MyInterface.

Код: java
1.
@Inject MyInterface myInterface



По-этому вопрос по-прежнему не понятен, вернее теперь вопрос понятен, а цель - нет. Ты хочешь сделать тоже самое, что в примере, но с абстрактным классом?
ну попробуй - я не вижу технических причин, почему это не должно работать, но возможно это не будет работает просто, потому что автор АА подумал про фокус с интерфейсом и не подумал про тоже самое с абстрактным классом (т.е. у него в коде тупо валидация может стоять на наличие интерфейса). С точки зрения ява кода нет никаких преград. Но с точки зрения архитектуры приложения - это страдание фигней. Нужна настоящая DI, юзай DI, roboguice например. АА не для этого (но хорошо вписывается, поскольку по сути является генератором "имплементаций")
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39279930
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто то юзал Butter knife ?

В чем разница ?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39279975
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДжибсВ чем разница ?
в аа больше всего. намного. по сути в butterknife только инъекция вьюх и пару обработчиков событий. в аа передача параметров в активность/фрагмент, интенты, автоматическое сохранение данных (onsaveinstance/onrestore), background- процессы, onactivityresult, инъекция сервисов, создание и обработчики событий меню, sharedpreferences.
имхо слон и моська. единственная интересная штука в butterknife, инъекция в viewholder, в аа такое не прокатит, но думаю можно плагин написать (тоже кстати плюс)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
AndroidAnnotations
    #39678081
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пришлось кое-что поменять в своем старом проекте в связи с изменениями в сдк, студии и т.п.
Сделал следующие изменения, чтобы снова все работало:

build.graddle проекта (apt теперь не нужен):
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
        //classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    }
}

allprojects {
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}



Соответственно в build.graddle модуля (приложения) так же убираются все упоминания об apt
Код: xml
1.
apply plugin: 'com.android.application'


В buildTypes так же изменения (чтобы сгенерированный apk имел имя файла более осмысленного вида ru.wadman.somename-1.0-release.apk)
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    buildTypes {
        debug {
            minifyEnabled false
            debuggable true
        }

        release {
            minifyEnabled true
            debuggable false
            signingConfig signingConfigs.release
            proguardFiles 'proguard-rules.txt'
            applicationVariants.all { variant ->
                variant.outputs.all { output ->
                    outputFileName = defaultConfig.applicationId + "-" + defaultConfig.versionName + "-" + variant.buildType.name + ".apk"
                }
            }
        }
    }



И зависимости чуть изменились:
Код: xml
1.
2.
3.
4.
5.
6.
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    annotationProcessor "org.androidannotations:androidannotations:4.4.0"
    api 'org.androidannotations:androidannotations-api:4.4.0'
    api 'org.jetbrains:annotations-java5:15.0'
}

...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / Android [игнор отключен] [закрыт для гостей] / AndroidAnnotations
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]