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

Какую архитектуру предпочтительнее выбрать? - Android

Восстановить пароль Регистрация
Другие темы раздела
Android Получить Activity другого приложения http://www.cyberforum.ru/android-dev/thread1130308.html
Подскажите пожалуйста, могу ли я из своего приложения получить Activity другого? Или же как можно из своего приложения запустить Activity другого, чтобы можно было с ним взаимодействовать?
Android Android посредством Delphi (XE5) Здравствуйте, уважаемые форумчане. Занялся наконец разработкой дипломного проекта и неожиданно работа остановилась. Очень надеюсь, что поделитесь необходимой информацией со мной. В общем суть такова. Тема диплома звучит как "Разработка комплекса демонстрационных программ под ОС Android" - соответственно нужны какие-нибудь довольно простенькие Open-Source приложения (может быть калькулятор,... http://www.cyberforum.ru/android-dev/thread1130242.html
Android Посоветуйте алгоритм визуализации графов
Немного не по теме андроида (извините), но желательно что-бы отвечающие думали на яве(как я сейчас), а не направляли меня читать статьи по теме на питоне/VBA/Perl/Prolog... Даже с теорией подобного не встречался... Давно мечтаю, а сейчас захотел попробовать нарисовать... Есть таблица связанных элеметов. Есть примерные коефициенты связей ("близость"). Хочу получить (статичную) картинку вроде...
Подключиться к сервису Android
В Activity запускается сервис (работает в фоне), который обновляет ProgressBar, закрыв активность кнопкой Back и вернувшись снова, progressBar не обновляется, но сервис продолжает работать. Как можно подключиться к сервису и получить прогресс? Пытаюсь сделать простой пример, пока выводящий просто значения в TextView. Но при закрытии активности и возврате в неё, данные в textView не...
Android Drawer Layout http://www.cyberforum.ru/android-dev/thread1129645.html
Имеется Drawer Layout со списком меню. Каждое меню кликабельно и меняет Fragment-ы. При нажатии на пункт списка выполняется метод: private void selectItem(int position) { mDrawerList.setItemChecked(position, true); mDrawerLayout.closeDrawer(mDrawerList); FragmentManager fm = getFragmentManager(); switch(position) {
Android Запрос по SOAP Как взаимодействовать с Веб сервисами ../ws?wsdl Exlipce подробнее

Показать сообщение отдельно
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
27.03.2014, 16:16     Какую архитектуру предпочтительнее выбрать?
Nachinka, давайте я Вам напишу архитектуру клиента (как я её вижу и как бы я её делал), подождите чуть

Добавлено через 30 минут
Nachinka, нет ничего проще, смотрите

Эпиграф. Я люблю паттерны Singleton, Proxy и предпочитаю модульную структуру, соответственно, я буду строить всё на них.

Первое что надо понять: мы используем асинхронные процессы, что подразумевает callback. Другими словами нам потребуется интерфейс обратного вызова.

1. Создадим классный и совсем не толстый HttpClient. Создаём HttpClientFactory.java (хотя технически говоря это ни разу не factory, но так уж повелось):

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
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
 
public class HttpClientFactory {
    public static final int SOCKET_TIMEOUT = 25000;
    public static final int CONNECTION_TIMEOUT = 15000;
    public static final String HTTPS = "https";
    public static final String HTTP = "http";
    public static final int PORT80 = 80;
    public static final int PORT443 = 443;
    private static DefaultHttpClient client;
 
    public synchronized static DefaultHttpClient getThreadSafeClient() {
        if (client != null) {
            return client;
        }
        client = new DefaultHttpClient();
        ClientConnectionManager mgr = client.getConnectionManager();
        mgr.getSchemeRegistry().register(new Scheme(HTTP, PlainSocketFactory.getSocketFactory(), PORT80));
        mgr.getSchemeRegistry().register(new Scheme(HTTPS, SSLSocketFactory.getSocketFactory(), PORT443));
        HttpParams params = client.getParams();
        HttpConnectionParams.setSoTimeout(params, SOCKET_TIMEOUT);
        HttpConnectionParams.setConnectionTimeout(params, CONNECTION_TIMEOUT);
        client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, mgr.getSchemeRegistry()), params);
        return client;
    }
}
2. Давайте сделаем универсальный асинхронную задачу. Воспользуемся мощностью generic для определения последнего типа: AsyncTask<Void, Void, T>:

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
import android.os.AsyncTask;
 
public abstract class CommonAsyncTask<T> extends AsyncTask<Void, Void, T> {
 
    private IAsyncCallback<T> callback; //Интерфейс обратного вызова
    private Throwable throwable; //Тут будет предполагаемый exception
 
    protected CommonAsyncTask(IAsyncCallback<T> callback) {
        this.callback = callback;
    }
 
    @Override
    protected T doInBackground(Void... params) {
        T data = null;
        try {
            data = doAction();
        } catch (Throwable t) {
            throwable = t;
        }
        return data;
    }
 
    @Override
    protected void onPostExecute(T t) {
        super.onPostExecute(t);
        if (callback == null)return;
        generateCallback(t);
    }
 
    public abstract T doAction() throws Throwable; //Обязательно переопределям эту штуку, она будет вызываться в паралельном потоке
 
    public void generateCallback(T result) {
        if (result != null) {               //Всё ок, пробрасываем ответ
            callback.onSuccess(result);
        } else if (throwable != null) {     //Что-то случилось плохое
            callback.onFailure(throwable.toString());
        } else {
            callback.onFailure("Oops! Something goes wrong!"); //А это мы в *опе, не резульата, не exception. Теоретически невозможная ситуация
        }
    }
}
Что мы сейчас сделали. При вызове AsyncTask#execute() идёт следующий порядок вызова:

onPreExecute() в UI-потоке ----> doInBackground() в другом потоке ------> onPreExecute() в конце в UI потоке.

Мы сделали так, что doInBackground вызывает doAction метод, мы его и будем переопределять. Как-то так

Поехали дальше:

3. Ой, забыл. Сам интерфейс обратного вызова, опять же generic

Java
1
2
3
4
5
6
public interface IAsyncCallback<T> {
 
    void onSuccess(T data);
 
    void onFailure(String reason);
}
4. Создадим какую-нибудь модельку для примера, пусть будет User:

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
import java.io.Serializable;
 
public class User implements Serializable {
    private int id;
    private String userName;
    private String token;
 
    public User(int id, String userName, String token) {
        this.id = id;
        this.userName = userName;
        this.token = token;
    }
 
    public User() {
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getUserName() {
        return userName;
    }
 
    public void setUserName(String userName) {
        this.userName = userName;
    }
 
    public String getToken() {
        return token;
    }
 
    public void setToken(String token) {
        this.token = token;
    }
 
    //Builder
    public static User parseUser(JSONObject jsonObject) throws JSONException {
        User model = new User();
        model.id = jsonObject.getInt("id");
        model.userName = jsonObject.getString("username");
        model.token = jsonObject.getString("token");
        return model;
   }
}
думаю, всё понятно. Последний метод-билдер конструирует из JSON полноценную модель.

5. Почти всё, честно. Модуль авторизации:

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
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
 
public class AuthorizationModule {
 
    private HttpClient httpClient = HttpClientFactory.getThreadSafeClient();
    private static AuthorizationModule instance;
 
    public static AuthorizationModule getInstance() {
        if (instance == null) {
            instance = new AuthorizationModule();
        }
        return instance;
    }
 
    private AuthorizationModule() {}
 
 
 
 
    public User doLogin(String login, String password) throws Throwable{
        HttpPost post = new HttpPost("localhost:3000/api/login");
        //Тут добавляем NameValuePairs, либо StringEntity, либо ещё какое-нибудь п*рно :)
        HttpResponse response = httpClient.execute(post);
        return User.parseUser(new JSONObject(EntityUtils.toString(response.getEntity())));
    }
}
6. И сам менеджер:

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
/**
 * Это будет наш прокси класс. Естесно - singleton
 * Proxy - паттерн единой входной точки
 */
public class DataManager {
 
    private static DataManager instance;
 
    private DataManager(){}
 
    public static DataManager getInstance() {
        if (instance == null) {
            instance = new DataManager();
        }
        return instance;
    }
 
    public void doLogin(final String login, final String password, IAsyncCallback<User> callback) {
        new CommonAsyncTask<User>(callback) {
            @Override
            public User doAction() throws Throwable {
                return AuthorizationModule.getInstance().doLogin(login, password);
            }
        }.execute();
    }
 
}
7. Всё, вызов будет предельно прост, из любой точки приложения (главное из UI потока, иначе AsyncTask не отработает, вот такая вот особенность)

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
public class MyActivity extends Activity {
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
 
 
    public void doLogin() {
        DataManager.getInstance().doLogin("cyberName", "cyberPass", new IAsyncCallback<User>() {
            @Override
            public void onSuccess(User data) {
                 //Всё ок
            }
 
            @Override
            public void onFailure(String reason) {
                //Всё плохо
            }
        });
    }
}
 
Текущее время: 01:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru