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

Подключаемые библиотеки в Android Studio - Android

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
31.10.2015, 00:01     Подключаемые библиотеки в Android Studio #1
Сразу скажу что я нуб, сегодня первый день когда взялся за java и android studio. Написал пока примитивный класс для отправки post данных на сервер.
И большую часть времени потратил на разбор полетов с android studio, потому как:

1) org.apache.http почему-то не входит в стандартный набор пакетов, как скачать через стандартные тулсы ide я не нашел.
Зашел на сайт апача, скачал библиотеки, закинул в папку проекта \app\libs (httpclient-4.5.1, httpcore-4.4.3) и в android studio правой кнопкой мыши добавил эти библиотеки ( зачем это кстати если они уже лежат в папке lib ? ).

2) после добавления необходимых библиотек, выпал error:
Error:duplicate files during packaging of APK app\build\outputs\apk\app-debug-unaligned.apk
Path in archive: META-INF/DEPENDENCIES
Origin 1: \app\libs\httpclient-4.5.1.jar
Origin 2: \app\libs\httpcore-4.4.3.jar
По совету компилятора добавил в build.gradle
Код
packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
}
но WTF ? что это еще за история, какая еще дубликация файлов если как я понял у каждой библиотеки есть такие файлы.

3) Теперь ошибок нет, но приложение вылетает и в дебагере ничего нет, елки палки ну как искать тогда ошибки ?
окей, запустил этот метод отправки post не при старте приложения, а при нажатии на кнопку и тут уже дебаг показал:
FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.VerifyError: org/apache/http/conn/ssl/DefaultHostnameVerifier
E/AndroidRuntime: at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:944)
E/AndroidRuntime: at ru.project.te.api.send(api.java:38)
E/AndroidRuntime: at ru.project.te.MainActivity$1.onClick(MainActivity.java:40)
E/AndroidRuntime: at android.view.View.performClick(View.java:4276)
E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:17757)
E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:730)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5223)
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:525)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
Да что ты б** опять не работаешь ?!

Что теперь править, что бы элементарный post запрос отработал ?

Код прилагаю:
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
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
 
public class api {
 
    private String url = "http://example.com/api.php";
    private String key = "test";
 
 
 
    public String send( String method_name , List<NameValuePair> params ){
 
        HttpClient client; // web клиента
        HttpPost request; // POST запрос
        HttpResponse response; // объект ответа
        HttpEntity httpEntity; // http объект
        String content = null; // string ответ
        
        try {
 
            // создаем web клиента
            client = HttpClientBuilder.create().build();
 
            // формируем url запроса и создаем POST объект
            request = new HttpPost( this.url + "?key=" + key + "&method=" + method_name );
 
            // заполняем POST объект данными из входящего массива params
            request.setEntity(new UrlEncodedFormEntity(params));
 
            // выполняем запрос
            response = client.execute(request);
 
            // создаем http сущность ответа
            httpEntity = response.getEntity();
 
            // через утилиту EntityUtils конвертируем поток из http объекта ответа в string , с указанием кодировки
            content = EntityUtils.toString(httpEntity, "UTF-8");
 
        } catch (IOException e) {
            // в случае ошибки
            content = e.getMessage();
        }
 
        return content;
    }
 
}
p.s. может есть ide более "лучше" или просто я такой рукожоп ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
31.10.2015, 10:44     Подключаемые библиотеки в Android Studio #2
С IDE все впорядке. Библиотеки можно подключить в dependencies
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
31.10.2015, 14:23  [ТС]     Подключаемые библиотеки в Android Studio #3
YuraAAA, хм... спасибо, но не помогло.

Удалил библиотеки которые сам закачал и вернул build.gradle в исходное состояние, далее добавил в блок dependencies:
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
android studio что-то там грузил грузил в результате некоторые пакеты загрузились.
А вот эти все равно подсвечивает красным ( типо незнаю я что это ):
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
Это ведь часто используемые библиотеки если вообще не стандартные, что так сложно то все...
Есть ли возможность скачивать библиотеки без ручного поправления этого файла ? выбирать к примеру из готового списка
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 642
31.10.2015, 15:40     Подключаемые библиотеки в Android Studio #4
gradus, из мавен репозитория можно. погугли.
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
31.10.2015, 18:49  [ТС]     Подключаемые библиотеки в Android Studio #5
Mikalai, ок посмотрю.

Но все же хочу уточнить, в приведенном моем примере нельзя просто к примеру: добавить строку в настройки и все заработает ?
Тоооооесть.... вот этим примитивным скриптом я выхожу за рамки возможностей android studio и начинаю искать стороннее ПО что бы тупо подключить стандартные библиотеки ?
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 642
31.10.2015, 20:54     Подключаемые библиотеки в Android Studio #6
Цитата Сообщение от gradus Посмотреть сообщение
вот этим примитивным скриптом я выхожу за рамки возможностей android studio
AS это просто удобная IDE. Наверное правильно сказать за рамки Android SDK. Но это всё лирика. Вот тут почитай про Apache HTTP.
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
01.11.2015, 17:06  [ТС]     Подключаемые библиотеки в Android Studio #7
Mikalai, уже прочитал про это и еще узнал что web запросы не могут применяться в основном потоке.

После установки useLibrary 'org.apache.http.legacy' соответственно пишет о deprecated на классы: HttpClient , HttpPost , HttpResponse , HttpEntity .

Вопрос: как по "модному" надо отправить post запросы ?)
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 642
01.11.2015, 17:20     Подключаемые библиотеки в Android Studio #8
gradus, вот. Можно поискать стороннюю библиотеку - лоадер какой-нить. Короче, как душе угодно.
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
02.11.2015, 16:53  [ТС]     Подключаемые библиотеки в Android Studio #9
В общем ладно, буду использовать DefaultHttpClient.
Раз уж надо делать в отдельном потоке запросы, то хочу сделать некий callback по результату.
Как я хочу сделать: вызываю метод для получения данных и в параметр этого метода передаю ссылку на метод который должен вызваться с полученным результатом.
Собственно вопрос, как сделать callback ?)
Что-то типо того:
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
public class MainActivity extends AppCompatActivity {
 
    public TextView TextLog;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        this.TextLog = (TextView) findViewById(R.id.textView);
 
        Button button = (Button) findViewById(R.id.button);
        
        button.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
                //запускаем наш rest с Async
                rest api = new rest();
                api.execute( {ссылка на объект MainActivity и его метод input_user_name  } );
            }
        });
    }
    
    public void input_user_name(String user_name){
        this.TextLog.setText( user_name );
    }
}
Добавлено через 7 минут
Ну или может есть еще хорошие способы, только не сложные) я только начал изучать
Видел примеры где класс в классе, для меня это как-то не эстетично.
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
02.11.2015, 16:57     Подключаемые библиотеки в Android Studio #10
Цитата Сообщение от gradus Посмотреть сообщение
Видел примеры где класс в классе, для меня это как-то не эстетично.
Можно внутренний класс вынести в отдельный файл. Правда возможно придется его допиливать, если он использует поля или методы родительского класса.
Цитата Сообщение от gradus Посмотреть сообщение
Ну или может есть еще хорошие способы, только не сложные
Есть
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
02.11.2015, 22:15  [ТС]     Подключаемые библиотеки в Android Studio #11
Spelcrawler, AsyncTask эт ж вроде абстрактный класс для отдельного потока. А как callback, то в нем сделать ?
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 642
02.11.2015, 22:37     Подключаемые библиотеки в Android Studio #12
gradus, тут почитай уроки 80-91.
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
03.11.2015, 13:06  [ТС]     Подключаемые библиотеки в Android Studio #13
В общем не работает и ошибок не пишет

Создал класс запроса:
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
public class net extends AsyncTask<String, Void, String>  {
 
    Task CallBack;
 
    public net(Task CallBack){
        this.CallBack = CallBack;
    }
 
    protected void onPreExecute() {
      this.CallBack.before();
    }
 
    @Override
    protected String doInBackground(String... params) {
        
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost http = new HttpPost("http://127.0.0.1/");
        String response = null ;
 
        List nameValuePairs = this.CallBack.param_get();
 
        try {
            http.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            response = httpclient.execute(http, new BasicResponseHandler());
        } catch (UnsupportedEncodingException e) {
            this.CallBack.error("encode",  e.hashCode() + " " + e.getMessage() );
        }catch (IOException e) {
            this.CallBack.error("IOException",  e.hashCode() + " " + e.getMessage() );
        }
 
        this.CallBack.success(response);
 
        return response;
    }
 
    protected void onPostExecute(String res) {
        this.CallBack.Complete();
    }
}
Создал абстрактный класс:
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
public abstract class Task {
 
    private String result;
    private String errror_code;
    private String error_message;
 
    private List nameValuePairs = new ArrayList();
 
    final public void success(String result){
        this.result = result;
    }
 
    public void before(){}
 
    final public String getResult(){
        return this.result;
    }
 
    abstract void Complete();
 
    final public void error(String Code, String errorMessage){
        this.errror_code = Code;
        this.error_message = errorMessage;
    }
 
    final public void error(Integer Code, String errorMessage){
        this.error( Code.toString() , errorMessage );
    }
 
    final public boolean is_success(){
        return this.errror_code != null;
    }
 
    final public String get_error_message(){
        return this.errror_code + ": " + this.error_message;
    }
 
    final public void param_add(String key, String val){
        this.nameValuePairs.add(new BasicNameValuePair(key, val));
    }
 
    final public List param_get(){
        return this.nameValuePairs;
    }
}
Далее в MainActivity:
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
public class MainActivity extends AppCompatActivity {
 
    public TextView TextLog;
    public EditText loginInput;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        this.TextLog = (TextView) findViewById(R.id.textView);
 
        this.loginInput = (EditText) findViewById(R.id.editText);
 
        Button button = (Button) findViewById(R.id.button);
 
        button.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
 
                String login = loginInput.getText().toString();
                auth authObj = new auth(login);
                new net(authObj);
            }
        });
    }
 
 
    class auth extends Task{
 
        public auth(String login){
            this.param_add("login", login);
        }
 
        public void Complete(){
            TextLog.setText( "Complate" );
        }
 
        public void before(){
            TextLog.setText( "start" );
        }
 
    }
}
Не срабатывают методы в подклассе auth: Complete , before
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
03.11.2015, 13:14     Подключаемые библиотеки в Android Studio #14
Цитата Сообщение от gradus Посмотреть сообщение
this.CallBack.success(response);
перенести в onPostExecute, иначе краш будет.

Цитата Сообщение от gradus Посмотреть сообщение
new net(authObj);
Java
1
new net(authObj).execute();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2015, 13:24     Подключаемые библиотеки в Android Studio
Еще ссылки по теме:

Android Studio Android
Android Кнопка Android studio
Android Подключение Android Annotations к Android Studio
Android Android Studio
Android Studio Android

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

Или воспользуйтесь поиском по форуму:
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
03.11.2015, 13:24  [ТС]     Подключаемые библиотеки в Android Studio #15
YuraAAA, а блин точно, про execute забыл )
Все круто, все работает. Всем большое спс)
Yandex
Объявления
03.11.2015, 13:24     Подключаемые библиотеки в Android Studio
Ответ Создать тему
Опции темы

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