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

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

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

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

08.02.2015, 13:50. Просмотров 352. Ответов 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;
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2015, 13:50
Я подобрал для вас темы с готовыми решениями и ответами на вопрос UiThread, как вынести процесс из главного потока? (Программирование Android):

Android UiThread (UI thread) - Программирование Android
кто-нибудь может объяснить , что это такое и как используется на примере?

Как вынести строку текста из BackGroundWorker в RichTextBox главного потока? - Visual Basic .NET
Всем доброго времени суток. У меня такой вопрос: Использую BackGroundWorker для опроса периферии. По ответам устройств составляется...

VC++6.0, как из порожденного потока прочитать переменную главного потока? - Visual C++
Visual C++ 6.0 SP5 Простое диалоговое окно, (MFC) созданное мастером среды VC По нажатию на кнопку создаю поражденный поток, в...

.NET 4.x Не получается с вторичного потока обратиться напрямую к объекту из главного потока - C# WPF
Добрый день. Проблема заключается в том что не могу в WPF с вторичного потока обратится на прямую к объекту из главного потока. WPF пока...

Многопоточность: вызвать метод главного потока из второстепенного потока - Java SE
Здравствуйте. Эта тема всеми избита, знаю. Но у меня очень ограничено время, поэтому рискую и пишу вопрос тут: Пишу приложение...

Как вызвать методы Unity вне главного потока? - Unity, Unity3D
Привет. У меня есть асинхронный сервер и клиент. И вся инфа, которая приходит от сервера к клиенту, обрабатывается в отдельном потоке, но...

9
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 600
08.02.2015, 14:21 #2
Цитата Сообщение от IrenJensen Посмотреть сообщение
Я - новичок в Android. Нужно в этом куске кода реализовать многопоточность. Очистить главный поток от операций, связанных с соединением с сервером, ибо вылетает. Как это сделать? Помогите, пожалуйста.
Посмотрите Java Threads, думаю сразу все станет ясно... хотя лучше AsyncTask использовать, чтобы обновить интерфейс по завершению действий в дополнительном потоке.
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
08.02.2015, 14:34 #3
Цитата Сообщение от contedevel Посмотреть сообщение
хотя лучше AsyncTask использовать
Так она его и использует.
Правда, достаточно диковинным образом
0
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 600
08.02.2015, 14:37 #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");
     }
 }
0
IrenJensen
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 9
08.02.2015, 15:53  [ТС] #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();
        }
    }
0
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 600
08.02.2015, 15:56 #6
Здесь
Java
1
2
3
txtName = (EditText) findViewById(R.id.inputName);
                            txtPrice = (EditText) findViewById(R.id.inputPrice);
                            txtDesc = (EditText) findViewById(R.id.inputDesc);
0
IrenJensen
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 9
08.02.2015, 16:03  [ТС] #7
contedevel, это нужно перенести в onPostExecute?
0
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 600
08.02.2015, 16:11 #8
Цитата Сообщение от IrenJensen Посмотреть сообщение
это нужно перенести в onPostExecute?
Не просто перенести, Вам нужно код переделать, чтобы doInBackground вернула нужную Вам строку, к примеру, а там ее распарсить... Или свои поля создать и туда прописать, что нужно, а в onPostExecute считать и отобразить в EditText
0
IrenJensen
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 9
08.02.2015, 16:13  [ТС] #9
contedevel, спасибо за ответ, постараюсь разобраться!
0
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 600
08.02.2015, 16:16 #10
Цитата Сообщение от IrenJensen Посмотреть сообщение
спасибо за ответ, постараюсь разобраться!
Рад был помочь!
0
08.02.2015, 16:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2015, 16:16
Привет! Вот еще темы с ответами:

Как запустить метод в главном потоке из не главного потока? - C#
Прив. У меня такая трабла, пишу клиент, для игры на одном движке, и если от сервера пришла какая-то определенная инфа, то мне необходимо...

Многопоточность. Как завершить неисполльзуемые потоки из главного потока - Java SE
Привет. Буду рад любым идеям и замечаниям. Пишу многопоточный сокет сервер. Архитектура такая. Есть форма. На форме кнопка. Кнопка...

Как при завершении главного потока прерывать фоновые потоки? - C#
При завершении главного потока фоновые прерываются. Как сделать?

Начать выполнение главного потока после того, как выполнятся другие - C#
Доброго времени суток. У меня вопрос, как сделать так, чтобы главный поток выполнялся, после того как выполнятся другие потоки. То что я...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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