Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Архитектура приложения - Программирование Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Оптимизация списка новостей http://www.cyberforum.ru/android-dev/thread1669857.html
Написал я небольшое приложение которое выводит новости с одного сайта. Все бы ничего, но получилось много катртинок. Очень много. Примерно к 10 новости все начинает тормозить, дальше вылетает с out...
Программирование Android Autolink, ExpandableListView Есть ExpandablelistView, в макете GroupItem есть TextView с атрибутом autolink = web. Этот автолинк блокирует разворачивание списка для просмотра дочерних элементов. т.е. метод GetGroupView адаптера,... http://www.cyberforum.ru/android-dev/thread1669465.html
Скачивание картинки из интернета в заданном разрешении Программирование Android
как скачать картинку из интернета с заданным размером. Для работы с большими растровыми изображениями http://developer.android.com/ советуют использовать подобные функции: private int...
Совместимость и проверка версии SDK, "обход" deprecated Программирование Android
java: addAction(int,java.lang.CharSequence,android.app.PendingIntent) in android.app.Notification.Builder has been deprecated Notification builder = new Notification.Builder(ctx) ...
Программирование Android Программа валится из-за неправильного кода, в чем ошибка? http://www.cyberforum.ru/android-dev/thread1669264.html
package com.example.ftmv1; import android.app.Activity; import android.os.Bundle; import android.widget.EditText; import android.widget.TextView; public class GenActivity extends Activity {...
Программирование Android Как извлечь данные из андроид-приложения (wifi analyzer)? Здравствуйте я должен измерят уровень сигнала из разных точках доступа wifi и в разных местах и использовать результаты измерения в расчета в матлаб. я нашел много приложении(например wifi analyzer)... подробнее

Показать сообщение отдельно
Ev[G]eN
iOS/Android Developer
Эксперт С++
5097 / 1535 / 381
Регистрация: 23.01.2011
Сообщений: 3,148

Архитектура приложения - Программирование Android

24.02.2016, 21:42. Просмотров 305. Ответов 2
Метки (Все метки)

Всем добрый вечер. За неимением большого опыта за плечами, столкнулся со сложностью в построении правильной архитектуры приложения.
Разрабатываю клиент-серверное приложение с REST API(модуль Retrofit). Написал под все серверное API сервисы, к примеру:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface IUserService {
 
    @GET("api/v1/user/logout")
    Call<User> logout();
 
    @GET("api/v1/user/current")
    Call<User> getCurrent();
 
    @POST("api/v1/user/register")
    Call<User> register(
            @Query("email") String email,
            @Query("password") String password,
            @Query("first_name") String firstName,
            @Query("last_name") String lastName
    );
 
    @POST("api/v1/user/login")
    Call<User> login(
            @Query("email") String email,
            @Query("password") String password,
            @Query("remember") int remember
    );
}
Допустим, при входе в приложение я пытаюсь залогинить пользователя. Изначально делал это методом из Activity:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
     ApiServiceHolder.getInstance()
                .createService(IUserService.class)
                .login(userEmail, userPassword, 0)
                .enqueue(new Callback<User>() {
                    @Override
                    public void onResponse(Response<User> response, Retrofit retrofit) {
                        // if authorization successful
                        if (response.code() == ApiConstants.ResponseCode.OK) {
                            // set ui language by device locale
                            setLocaleLanguage();
                            prepareUserDataInNavigationView();
                        } else {
                            startLoginActivity();
                            mProgressDialog.dismiss();
                        }
                    }
 
                    @Override
                    public void onFailure(Throwable t) {
                        mProgressDialog.dismiss();
                        ErrorNotification.authorizationError(sContext);
                    }
                });
Поднасобиралось таких методов, решил вынести это все в отдельные классы и написал для каждого своих слушателей:
Java
1
2
3
4
public interface OnUserLoginListener {
    void onUserLoginSuccess(User user);
    void onUserLoginFailed();
}
Переопределил стандартный Callback от retrofit'a:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public abstract class ResponseManager<ResponseType> implements Callback <ResponseType> {
 
    @Override
    public void onResponse(Response<ResponseType> response, Retrofit retrofit) {
        ProgressNotification.closeNotification();
        if (response.code() == ApiConstants.ResponseCode.OK) {
            onResponseSuccess(response.body());
        } else {
            onResponseFailed(response.message());
        }
    }
 
    @Override
    public void onFailure(Throwable t) {
        ProgressNotification.closeNotification();
    }
 
    public abstract void onResponseSuccess(ResponseType response);
 
    public void onResponseFailed(String message) {
        System.out.println(message);
    }
}
И для кажого сервиса сделал "обертку":
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
public class ApiUser extends ApiManager {
 
    private IUserService mUserService;
 
    public ApiUser(Context context) {
        super(context);
        mUserService = getServiceManager().createService(IUserService.class);
    }
 
public void login(String email, String password, int remember, final OnUserLoginListener listener) {
        ProgressNotification.authorizationProgress(mContext);
 
        mUserService.login(email, password, remember).enqueue(new ResponseManager<User>() {
            @Override
            public void onResponseSuccess(User response) {
                if (listener != null) {
                    listener.onUserLoginSuccess(response);
                }
            }
 
            @Override
            public void onResponseFailed(String message) {
                super.onResponseFailed(message);
                if (listener != null) {
                    listener.onUserLoginFailed();
                }
            }
        });
    }
 
    public void logout(final OnUserLogoutListener listener) {
        mUserService.logout().enqueue(new ResponseManager<User>() {
            @Override
            public void onResponseSuccess(User response) {
                if (listener != null) {
                    listener.onUserLogoutSuccess(response);
                }
            }
 
            @Override
            public void onResponseFailed(String message) {
                super.onResponseFailed(message);
                if (listener != null) {
                    listener.onUserLogoutFailed();
                }
            }
        });
    }
******************
И начал задаваться вопросами, а нормально ли передавать этих слушателей в параметре самого метода, или же стоит, допустим, сделать один метод для ApiUser'a по типу setListener(), и тем самым, как бы, принудить себя переопределять все его методы даже если они мне по сути не нужны. Сейчас же, если мне нужна именно функция login, то именно для этой функции я этого слушателя и задам, и так для каждой.

В общем, прошу знающих поделиться своими предложениями как бы делали Вы, в чем не прав я. Буду рад критике и если кто-то подскажет как же это сделать именно ПРАВИЛЬНО с точки зрения архитектуры и т.д.

Спасибо
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru