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

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

Войти
Регистрация
Восстановить пароль
 
IrenJensen
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 9
#1

UiThread, как вынести процесс из главного потока? - Android

08.02.2015, 13:50. Просмотров 322. Ответов 9
Метки нет (Все метки)

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

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
 protected String doInBackground(String[] params) {
 
            // обновляем UI форму
            runOnUiThread(new Runnable() {
                public void run() {
                    // проверяем статус success тега
                    int success;
                    try {
                        // Список параметров
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("pid", pid));
 
                        // получаем продукт по HTTP запросу
                        JSONObject json = jsonParser.makeHttpRequest(url_product_detials, "GET", params);
 
                        Log.d("Single Product Details", json.toString());
 
                        success = json.getInt(TAG_SUCCESS);
                        if (success == 1) {
                            // Успешно получена детальная информация о продукте
                            JSONArray productObj = json.getJSONArray(TAG_PRODUCT);
 
                            // получаем первый обьект с JSON Array
                            JSONObject product = productObj.getJSONObject(0);
 
                            // продукт с pid найден
                            // Edit Text
                            txtName = (EditText) findViewById(R.id.inputName);
                            txtPrice = (EditText) findViewById(R.id.inputPrice);
                            txtDesc = (EditText) findViewById(R.id.inputDesc);
 
                            // покаываем данные о продукте в EditText
                            txtName.setText(product.getString(TAG_NAME));
                            txtPrice.setText(product.getString(TAG_PRICE));
                            txtDesc.setText(product.getString(TAG_DESCRIPTION));
 
                        }else{
                            // продукт с pid не найден
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
 
            return null;
        }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2015, 13:50     UiThread, как вынести процесс из главного потока?
Посмотрите здесь:

Android Хочу вынести функцию в другой файл
Android Android UiThread (UI thread)
Открыть активити не из главного класса Android
Android Вынести метод в отдельный класс
Как из одного потока вызвать метод таким образом, чтобы он выполнялся в другом потоке Android
Как можно в progressBar вернуть прогресс нужного потока? Android
Android Вынести классы ядра в библиотеки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 590
08.02.2015, 14:21     UiThread, как вынести процесс из главного потока? #2
Цитата Сообщение от IrenJensen Посмотреть сообщение
Я - новичок в Android. Нужно в этом куске кода реализовать многопоточность. Очистить главный поток от операций, связанных с соединением с сервером, ибо вылетает. Как это сделать? Помогите, пожалуйста.
Посмотрите Java Threads, думаю сразу все станет ясно... хотя лучше AsyncTask использовать, чтобы обновить интерфейс по завершению действий в дополнительном потоке.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
08.02.2015, 14:34     UiThread, как вынести процесс из главного потока? #3
Цитата Сообщение от contedevel Посмотреть сообщение
хотя лучше AsyncTask использовать
Так она его и использует.
Правда, достаточно диковинным образом
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 590
08.02.2015, 14:37     UiThread, как вынести процесс из главного потока? #4
Цитата Сообщение от Armagedo Посмотреть сообщение
Правда, достаточно диковинным образом
Мда, код не глянул)

Добавлено через 1 минуту
Цитата Сообщение от IrenJensen Посмотреть сообщение
Я - новичок в Android. Нужно в этом куске кода реализовать многопоточность. Очистить главный поток от операций, связанных с соединением с сервером, ибо вылетает. Как это сделать? Помогите, пожалуйста.
Вам нельзя реализовывать доступ к элементам основного потока, для этого есть метод onPostExecute
Вот пример:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }
 
     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }
 
     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }
IrenJensen
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 9
08.02.2015, 15:53  [ТС]     UiThread, как вынести процесс из главного потока? #5
contedevel, весь исходник не мой, взят из урока с сайта devcolibri.com. я не могу понять, что Вы имеете ввиду. Ткните носом, где в коде реализован доступ к элементам основного потока и как от этого избавиться, подробнее, пожалуйста

Добавлено через 10 минут
кстати, onPostExecute там тоже используется. вот полный код класса:

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
class GetProductDetails extends AsyncTask<String, String, String> {
 
        /**
         * Перед началом показать в фоновом потоке прогресс диалог
         **/
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(EditProductActivity.this);
            pDialog.setMessage("Loading product details. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
 
        /**
         * Получение детальной информации о продукте в фоновом режиме
         **/
        protected String doInBackground(String[] params) {
 
            // обновляем UI форму
            runOnUiThread(new Runnable() {
                public void run() {
                    // проверяем статус success тега
                    int success;
                    try {
                        // Список параметров
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("pid", pid));
 
                        // получаем продукт по HTTP запросу
                        JSONObject json = jsonParser.makeHttpRequest(url_product_detials, "GET", params);
 
                        Log.d("Single Product Details", json.toString());
 
                        success = json.getInt(TAG_SUCCESS);
                        if (success == 1) {
                            // Успешно получинна детальная информация о продукте
                            JSONArray productObj = json.getJSONArray(TAG_PRODUCT);
 
                            // получаем первый обьект с JSON Array
                            JSONObject product = productObj.getJSONObject(0);
 
                            // продукт с pid найден
                            // Edit Text
                            txtName = (EditText) findViewById(R.id.inputName);
                            txtPrice = (EditText) findViewById(R.id.inputPrice);
                            txtDesc = (EditText) findViewById(R.id.inputDesc);
 
                            // покаываем данные о продукте в EditText
                            txtName.setText(product.getString(TAG_NAME));
                            txtPrice.setText(product.getString(TAG_PRICE));
                            txtDesc.setText(product.getString(TAG_DESCRIPTION));
 
                        }else{
                            // продукт с pid не найден
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
 
            return null;
        }
 
        /**
         * После завершения фоновой задачи закрываем диалог прогресс
         **/
        protected void onPostExecute(String file_url) {
            // закрываем диалог прогресс
 
            super.onPostExecute("Hello");
            pDialog.dismiss();
        }
    }
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 590
08.02.2015, 15:56     UiThread, как вынести процесс из главного потока? #6
Здесь
Java
1
2
3
txtName = (EditText) findViewById(R.id.inputName);
                            txtPrice = (EditText) findViewById(R.id.inputPrice);
                            txtDesc = (EditText) findViewById(R.id.inputDesc);
IrenJensen
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 9
08.02.2015, 16:03  [ТС]     UiThread, как вынести процесс из главного потока? #7
contedevel, это нужно перенести в onPostExecute?
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 590
08.02.2015, 16:11     UiThread, как вынести процесс из главного потока? #8
Цитата Сообщение от IrenJensen Посмотреть сообщение
это нужно перенести в onPostExecute?
Не просто перенести, Вам нужно код переделать, чтобы doInBackground вернула нужную Вам строку, к примеру, а там ее распарсить... Или свои поля создать и туда прописать, что нужно, а в onPostExecute считать и отобразить в EditText
IrenJensen
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 9
08.02.2015, 16:13  [ТС]     UiThread, как вынести процесс из главного потока? #9
contedevel, спасибо за ответ, постараюсь разобраться!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2015, 16:16     UiThread, как вынести процесс из главного потока?
Еще ссылки по теме:

Android Как получить значение String из UI потока в потоке AsyncTask?
Android Как вытащить данные из потока. Cant create handler inside thread that has not called Looper.prepare()
Как забрать данные из отработавшего потока? Android
Android Как не допустить создание потока еще раз?
Как вынести подключение к БД в отдельный поток? Android

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

Или воспользуйтесь поиском по форуму:
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 590
08.02.2015, 16:16     UiThread, как вынести процесс из главного потока? #10
Цитата Сообщение от IrenJensen Посмотреть сообщение
спасибо за ответ, постараюсь разобраться!
Рад был помочь!
Yandex
Объявления
08.02.2015, 16:16     UiThread, как вынести процесс из главного потока?
Ответ Создать тему
Опции темы

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