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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Nachinka
11 / 11 / 0
Регистрация: 19.02.2014
Сообщений: 95
#1

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

26.03.2014, 17:22. Просмотров 708. Ответов 8
Метки нет (Все метки)

Всем приветов!

Возник небольшой вопрос.

Допустим имеется приложение, простенькая регистрация. Как правильнее организовать структуру такого приложения? Знаю, тема поднималась несколько сот раз, но все же..

Пока имеется такой вариант:

Само приложение ловим текст из полей ввода имени и пароля, отправляем его POST,ом на сервлет там данные заносятся в базу данных.С вводом данных, передачей и "заносом" в базу данных проблем думаю не возникнет.Но как вывести эти данные обратно?
Гуляет несколько примеров в сети, допустим так:

Java
1
response = HttpClient.HttpPost("127.0.0.1\server\servlet.java", postParameters);
Мы получим от туда, допустим, какую то переменную, что регистрация завершена.

Вообщем с базой данных непростой вопрос..

Кроме этой на ум схем что-то не приходит.Попробую сегодня написать что-нибудь.

Добавлено через 17 минут
Хотя можно ведь написать обработчик сервлета, который прочтет данные и добавит их в базу.
Потом с этим классом можно и работать, хотя тоже мутно представляю.. Ведь весь этот код на сервере как бы..
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 17:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Какую архитектуру предпочтительнее выбрать? (Программирование Android):

Выбрать архитектуру приложения с БД - Программирование Android
Доброго времени суток, уважаемые программисты! Помогите разобраться. Пытаюсь написать приложение с базой данных, которую заполняет...

Какую лицензию выбрать? - Программирование Android
Привет. Я сделал небольшое приложение, и мне хотелось бы указать для него какую-то лецензию, но я совершенно не разбираюсь в них....

Какую мне систему выбрать из электронной коммерции - Программирование Android
Подскажите с кем связаться чтоб реализовать данное: Я хотела бы реализовать на своём сайте оплату с мобильного счёта абонента:...

Какую среду разработки для мобильных систем выбрать? - Программирование
Всем привет. Решил заняться разработкой под Andoid и iOS. Посмотрел на 3 среды разработки: Android Studio, XCode, Visual Studio. Как...

Какой способ предпочтительнее для реализации повторяющейся функции - Программирование Android
Требуется раз в минуту выполнять определенное действие, скажем, на экране менять счетчик времени. Понятно, что это надо делать не в UI. ...

Приложение с БД - посоветуйте архитектуру - Программирование Android
Два вопроса , они родственные между собой: Пишу приложение ну допустим "Смешные историй" , в котором каждый день будут добавляться...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
YuraAAA
1574 / 1316 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
26.03.2014, 21:48 #2
Nachinka,

UserInterface------>AsyncManager------>HttpClient------>POSTREQUEST------>Tomcat------>ServletDispatcher (Mapping)------>Servlet------>Controller------>DAO------>Controler------>RESPONSE------> HttpClient---->Распаковываем данные, вытаскиваем, к примеру JSON формат, {status:200, token:"x-123mfsqpqkm",username:"cyberforum"}---->UI

Добавлено через 6 минут
В ответе мы имеем поток ответа.
Java
1
JSONObject response = new JSONObject(EntityUtils.toString(httpResponse.getEntity));
1
Nachinka
11 / 11 / 0
Регистрация: 19.02.2014
Сообщений: 95
26.03.2014, 22:37  [ТС] #3
Написал маленький примерчик(неработающий)
Упал примерчик вот с такими ошибками:

Bash
1
2
3
4
5
6
7
8
9
10
03-26 17:45:03.360: E/AndroidRuntime(784): FATAL EXCEPTION: main
03-26 17:45:03.360: E/AndroidRuntime(784): android.os.NetworkOnMainThreadException
03-26 17:45:03.360: E/AndroidRuntime(784):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
03-26 17:45:03.360: E/AndroidRuntime(784):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
03-26 17:45:03.360: E/AndroidRuntime(784):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
03-26 17:45:03.360: E/AndroidRuntime(784):  at java.net.InetAddress.getAllByName(InetAddress.java:214)
03-26 17:45:03.360: E/AndroidRuntime(784):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
03-26 17:45:03.360: E/AndroidRuntime(784):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
03-26 17:45:03.360: E/AndroidRuntime(784):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
03-26 17:45:03.360: E/AndroidRuntime(784):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
Основной код приложения:

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class MainActivity extends Activity implements OnClickListener {
 
    Button login;
    EditText loginText;
    EditText passText;
    String TAG = "TAG";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        loginText = (EditText) findViewById(R.id.TextLogin);
        passText = (EditText) findViewById(R.id.TextPass);
        login = (Button) findViewById(R.id.buttonLog);
        login.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View v) {
        if (loginText.getText().toString().matches("")
                || passText.getText().toString().matches("")) {
            Toast.makeText(MainActivity.this, "Login it's false!",
                    Toast.LENGTH_SHORT).show();
            return;
        } else {
            Toast.makeText(MainActivity.this, "Login it's try",
                    Toast.LENGTH_SHORT).show();
            PostToServer(loginText.getText().toString(), passText.getText()
                    .toString());
            Log.d(TAG, "lOGIN COMPLITE!");
        }
    }
 
    private void PostToServer(String stringLog, String stringPass) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://onlyt.ru/index.php");
        try {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("username", stringLog));
            nameValuePairs.add(new BasicNameValuePair("password", stringPass));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
 
            String str = inputStreamToString(response.getEntity().getContent())
                    .toString();
            Log.w(TAG, "registr...");
            if (str.toString().equalsIgnoreCase("true")) {
                Log.w(TAG, "Registr sucefful");
            } else {
                Log.w(TAG, "Registr it's false");
            }
 
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    private StringBuilder inputStreamToString(InputStream is) {
        String line = "";
        StringBuilder total = new StringBuilder();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        try {
            while ((line = rd.readLine()) != null) {
                total.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return total;
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
}
Пока поднял Денверок) с таким вот скриптом:

PHP
1
2
3
4
5
6
7
8
9
<?php
$username = $_POST['username'];
$password = $_POST['password'];
if($username=='User' && $password == '12345'){
echo "true";
}else{
echo "false";
}
?>
Попробую томката поднять.

Добавлено через 39 минут
Что то сервлет тоже не помог, хотя в этот раз ошибок нет.

Основной код:

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
import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class MainActivity extends Activity implements OnClickListener {
 
    Button login;
    EditText loginText;
    EditText passText;
    String TAG = "TAG";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        loginText = (EditText) findViewById(R.id.TextLogin);
        passText = (EditText) findViewById(R.id.TextPass);
        login = (Button) findViewById(R.id.buttonLog);
        login.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View v) {
        if (loginText.getText().toString().matches("")
                || passText.getText().toString().matches("")) {
            Toast.makeText(MainActivity.this, "Login it's false!",
                    Toast.LENGTH_SHORT).show();
            return;
        } else {
            Toast.makeText(MainActivity.this, "Login it's try",
                    Toast.LENGTH_SHORT).show();
            PostToServer(loginText.getText().toString(), passText.getText()
                    .toString());
            Log.d(TAG, "lOGIN COMPLITE!");
        }
    }
 
    private void PostToServer(String stringLog, String stringPass) {
        ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
        postParameters.add(new BasicNameValuePair("username",stringLog));
        postParameters.add(new BasicNameValuePair("password",stringPass));
        String response = null;
        Log.d(TAG, "process...");
        try {
            response = CustomHttpClient.executeHttpPost("http://localhost:8080/myapp/about", postParameters);
            String res=response.toString();
            res= res.replaceAll("\\s+","");
            if(res.equals("1"))
                Log.d(TAG, "TRUE! REG");
            else
                Log.d(TAG, "FALSE! REG");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
}

Код сервлета:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class MyServlet extends HttpServlet {
   @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        PrintWriter out=response.getWriter();
        String un,pw;
        un=request.getParameter("username");
        pw=request.getParameter("password");
        if(un.equalsIgnoreCase("user") && pw.equals("12345")){
            out.print(1);
        }else{
            out.print(0);
        }
    }
}
0
YuraAAA
1574 / 1316 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
27.03.2014, 11:44 #4
Nachinka,
Цитата Сообщение от Nachinka Посмотреть сообщение
android.os.NetworkOnMainThreadException
дело в том, что начиная с 4 версии андроид (а мб и с 3=) ) нельзя лезть в интернет из UI потока. Вам нужно использовать AsyncTask.

Добавлено через 35 секунд
А с кодом в принципе вроде всё хорошо
1
Nachinka
11 / 11 / 0
Регистрация: 19.02.2014
Сообщений: 95
27.03.2014, 12:58  [ТС] #5
Ух ты..А как его использовать то этот AsyncTask?)

Добавлено через 4 минуты
Как бы мне теперь все это вот сюда засунуть:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MyTask extends AsyncTask<Void, Void, Void> {
 
    @Override
    protected void onPreExecute() {
      super.onPreExecute();
      tvInfo.setText("Begin");
    }
 
    @Override
    protected Void doInBackground(Void... params) {
        //Какой код засунуть сюда?
      return null;
    }
 
    @Override
    protected void onPostExecute(Void result) {
      super.onPostExecute(result);
      tvInfo.setText("End");
    }
  }
0
YuraAAA
1574 / 1316 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
27.03.2014, 13:02 #6
Nachinka, а вот так:
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
    class MyTask extends AsyncTask<Void, Void, Void> {
 
        private String stringLog;
        private String stringPass;
 
        MyTask(String stringLog, String stringPass) {
            this.stringLog = stringLog;
            this.stringPass = stringPass;
        }
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            tvInfo.setText("Begin");
        }
 
        @Override
        protected Void doInBackground(Void... params) {
            PostToServer(stringLog, stringPass);
            return null;
        }
 
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            tvInfo.setText("End");
        }
    }
Вызов - new MyTask("log","pass").execute();
1
Nachinka
11 / 11 / 0
Регистрация: 19.02.2014
Сообщений: 95
27.03.2014, 15:35  [ТС] #7
Спасибо!

Вот такой кодец пробую:

Основной код(Активити):

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
import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class MainActivity extends Activity implements OnClickListener {
 
    Button login;
    EditText loginText;
    EditText passText;
    String TAG = "TAG";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        loginText = (EditText) findViewById(R.id.TextLogin);
        passText = (EditText) findViewById(R.id.TextPass);
        login = (Button) findViewById(R.id.buttonLog);
        login.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View v) {
        if (loginText.getText().toString().matches("")
                || passText.getText().toString().matches("")) {
            Toast.makeText(MainActivity.this, "Login it's false!",
                    Toast.LENGTH_SHORT).show();
            return;
        } else {
            Toast.makeText(MainActivity.this, "Login it's try",
                    Toast.LENGTH_SHORT).show();
            new MyTask(loginText.getText().toString(), passText.getText()
                    .toString()).execute();
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
}

Код таска:


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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
 
import android.os.AsyncTask;
import android.util.Log;
 
class MyTask extends AsyncTask<Void, Void, Void> {
 
    private String stringLog;
    private String stringPass;
    String TAG = "TAG";
 
    MyTask(String stringLog, String stringPass) {
        this.stringLog = stringLog;
        this.stringPass = stringPass;
    }
 
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.d(TAG, "Begin.");
    }
 
    @Override
    protected Void doInBackground(Void... params) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://onlyt.ru/index.php");//Адрес сайта, на денвере
 
        try {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("username", stringLog));
            nameValuePairs.add(new BasicNameValuePair("password", stringPass));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
 
            Log.d(TAG, "Execute HTTP Post Request");
            HttpResponse response = httpclient.execute(httppost);
            String str = inputStreamToString(response.getEntity().getContent())
                    .toString();
            Log.d(TAG, str);
 
            if (str.toString().equalsIgnoreCase("true")) {
                Log.d(TAG, "TRUE");
            } else {
                Log.d(TAG, "FALSE");
            }
 
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
 
    private StringBuilder inputStreamToString(InputStream is) {
        String line = "";
        StringBuilder total = new StringBuilder();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        try {
            while ((line = rd.readLine()) != null) {
                total.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return total;
    }
 
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        Log.d(TAG, "End.");
    }
}

Ну и простенький обработчик:
PHP
1
2
3
4
5
6
7
8
9
<?php
$username = $_POST['username'];
$password = $_POST['password'];
if($username=='user' && $password == '12345'){
echo "true";
}else{
echo "false";
}
?>
Обработчик поднят на денвере.

Логи выдают вот это:

Bash
1
2
3
03-27 11:35:05.116: D/TAG(778): Begin.
03-27 11:35:05.136: D/TAG(778): Execute HTTP Post Request
03-27 11:35:05.996: D/TAG(778): End.
0
YuraAAA
1574 / 1316 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
27.03.2014, 16:16 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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) {
                //Всё плохо
            }
        });
    }
}
1
Nachinka
11 / 11 / 0
Регистрация: 19.02.2014
Сообщений: 95
27.03.2014, 16:32  [ТС] #9
Я в шоке, огромное спасибо!!!

Буду изучать)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2014, 16:32
Привет! Вот еще темы с ответами:

Про архитектуру приложения - Программирование Android
Простите за возможную глупость вопроса - в мыслях запутался, а сам не выпутаюсь:) Допустим, есть одно активити с целой кучей...

Посоветуйте архитектуру приложения для отзывов с БД - Программирование Android
Добрый вечер, пишу приложение которое будет получать информацию из БД, что-то типа отзовика от меня. Есть 2 варианта реализации: 1) у меня...

Клиент-серверное приложение - посоветуйте архитектуру - Программирование Android
Всем доброго времени суток. Пишу клиент-серверное приложение с нуля, поэтому вопросов куча) Это уже вторая тема (первая...

MVP + фрагменты: как грамотно организовать архитектуру? - Программирование Android
Всем привет. Есть приложение, в котором есть базовый фрагмент, от которого наследуется 10-20 новых фрагментов. Отображают все они просто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.03.2014, 16:32
Ответ Создать тему
Опции темы

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