Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
JavJun
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
#1

Передача данных между потоками - Программирование Android

21.08.2016, 22:43. Просмотров 923. Ответов 16
Метки нет (Все метки)

Всем доброго времени суток. В общем есть приложение, которое парсит сайт с музыкой, добавляет результат в listView и затем выводит результат на экран. Сам парсинг проходит в одном потоке, а вывод на экран - в основном. Но поскольку выполнение поиска занимает не мало времени, то хотелось бы, что бы как только в listView попадает элемент - он сразу бы и отображался.
Ниже код:
Кликните здесь для просмотра всего текста
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
package ru.startandroid.webparser;
 
import android.os.Bundle;
import android.app.Activity;
import android.os.AsyncTask;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
 
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
 
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
 
public class MainActivity extends Activity {
 
    public Elements nextPage;
    public ArrayList<String> titleList = new ArrayList<>();
    public ArrayAdapter adapter;
    public ListView lv;
    public EditText eText;
    public Button btn;
    public String userRequest;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        eText = (EditText) findViewById(R.id.editText1);
        btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                userRequest = eText.getText().toString();
                // определение данных
                lv = (ListView) findViewById(R.id.listView1);
                // запрос к нашему отдельному поток на выборку данных
                new NewThread().execute();
                titleList.clear();
                // Добавляем данные для ListView
                adapter = new ArrayAdapter<>(MainActivity.this, R.layout.list_item, R.id.product_name, titleList);                
            }
        });
 
    }
 
    public class NewThread extends AsyncTask<String, Void, String> {
 
        @Override
        protected String doInBackground(String... arg) {
 
        try {
 
            /*Тут парсинг сайта согластно запросу и поиск значения artName, trackName, trackDur, trackLink*/
 
 
                        titleList.add(artName+" - "+trackName+" : "+trackDur+" "+"\n"+trackLink);
                    }
 
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
 
        @Override
        protected void onPostExecute(String result) {
 
            // после запроса обновляем листвью
            lv.setAdapter(adapter);
        }
    }
}


http://www.cyberforum.ru/android-dev/thread1514769.html

В андроиде полный новичок. Куча поиска привела только к использованию Handler, но не уверен что подойдет, да и когда пробовал - толком ничего не получилось.
Буду очень благодарен любой помощи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2016, 22:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Передача данных между потоками (Программирование Android):

Передача данных между Activity1 3
1. надо сделать что бы из 1 окна передать данные на 3 окно 2. если честно я...

Передача данных между activity
Здравствуйте! Для передачи данных между Activity требуется Пользователь...

Передача данных между устройствами
Всем привет! Подскажите, пожалуйста, как передать значение переменной на другое...

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

Передача данных между Activity
Доброго времени суток, господа. Такой вопрос: с точки зрения ООП...

16
Mikalai
262 / 238 / 95
Регистрация: 11.01.2015
Сообщений: 666
21.08.2016, 23:01 #2
JavJun, работу с сетью, на мой взгляд, лучше перенести в IntentService, а информацию между потоками и между компонентами удобно передавать через EventBus
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
22.08.2016, 09:26 #3
JavJun, AsyncTask вроде имеет метод вызываемый периодически по мере продвижения прогресса - вот в этом методе и обновляйте список если поменялось количество добавленных треков
0
Pablito
22.08.2016, 10:46
  #4

Не по теме:

зачем IntentService если будет EventBus
тогда уж просто Service

0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
22.08.2016, 11:21 #5
Самое тривиальное решение использовать AsyncTask + Handler,все остальное может нарушить принципы ООП, EventBus хорош,но имхо он служит для построения сложной архитектуры, у вас же все предельно просто, использование сервиса вам не подойдет ни обычного ни intentservice, передавайте в Handler массив ваших объектов и ловите в MainUI и все
0
Pablito
2645 / 2127 / 726
Регистрация: 12.05.2014
Сообщений: 7,434
Завершенные тесты: 1
22.08.2016, 11:24 #6
даже сами разработчики из гугла в своих видео не рекомендуют использовать AsyncTask-и
совет выше - так себе
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
22.08.2016, 11:37 #7
Паблито,

Не по теме:

сначала дайте ссылку на совет, и поясните что не так, голословностью не страдаем

0
Mikalai
22.08.2016, 11:43
  #8

Не по теме:


Паблито, IntentService что бы не порождать самому поток. Это конечно же не критично. Есть много вариантов. Тут каждый строчит как он хочет ))

0
Pablito
2645 / 2127 / 726
Регистрация: 12.05.2014
Сообщений: 7,434
Завершенные тесты: 1
22.08.2016, 11:52 #9
Цитата Сообщение от REALIST07 Посмотреть сообщение
сначала дайте ссылку на совет, и поясните что не так
не всегда есть желание пояснять очевидные вещи, в твоем сообщении тоже нет ссылок

если для кого-то пока неочевидно, что асинктаск - далеко не самое лучшее решение, это не моя проблема )
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
22.08.2016, 12:14 #10
Паблито, зато я могу аргументировать свою позицию, AsyncTask входит по умолчанию в пакет android.os,тот же самый EventBus подключаемая сторонняя библиотека, вопрос зачем включать тулз в свой пакет, который ты не рекомендуешь использовать? Я поэтому спросил про ссылку, вот мне,например, не очевидно почему его не стоит использовать? Конкретно в этой задаче нужно получить отдать, получить отдать, обеспечив потокобезопасность, так что либо аргументируйте свою позицию, либо проходите мимо

Не по теме:

P.S. Я видел немалое количество ваших комментариев в других ветках, вам стоит быть на мой взгляд повежливее, это не ветка фриланс и мы не соперники на этом форуме, мы люди, помогающие друг другу

0
Pablito
2645 / 2127 / 726
Регистрация: 12.05.2014
Сообщений: 7,434
Завершенные тесты: 1
22.08.2016, 12:21 #11
Цитата Сообщение от REALIST07 Посмотреть сообщение
зато я могу аргументировать свою позицию
Цитата Сообщение от REALIST07 Посмотреть сообщение
AsyncTask входит по умолчанию в пакет android.os,тот же самый EventBus подключаемая сторонняя библиотека
это не аргумент в сторону асинктаска
Цитата Сообщение от REALIST07 Посмотреть сообщение
Я поэтому спросил про ссылку, вот мне,например, не очевидно почему его не стоит использовать?
а я ответил что не желания повторять очевидные вещи, ответ на вопрос "чем плох асинктаск" гуглится за минуту

Не по теме:

Цитата Сообщение от REALIST07 Посмотреть сообщение
так что либо аргументируйте свою позицию, либо проходите мимо
Цитата Сообщение от REALIST07 Посмотреть сообщение
вам стоит быть на мой взгляд повежливее,
я забыл тебя спросить что мне делать

0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
22.08.2016, 12:36 #12
Паблито,

Не по теме:

много слов , мало дела, в добавок еще и хамло

0
JavJun
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
22.08.2016, 12:53  [ТС] #13
REALIST07, можете пожалуйста привести пример?
Прочитал кучу статей, самый простой пример из них:
Кликните здесь для просмотра всего текста
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
public class MainActivity extends Activity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ListView listView1 = (ListView) findViewById(R.id.listView1);
        
        Product[] items = { 
            new Product(1, "Milk", 21.50), 
            new Product(2, "Butter", 15.99), 
            new Product(3, "Yogurt", 14.90), 
            new Product(4, "Toothpaste", 7.99), 
            new Product(5, "Ice Cream", 10.00), 
        };
        
        ArrayAdapter<Product> adapter = new ArrayAdapter<Product>(this,
                    android.R.layout.simple_list_item_1, items);
        
        listView1.setAdapter(adapter);
 
        listView1.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                
                String item = ((TextView)view).getText().toString();
                
                Toast.makeText(getBaseContext(), item, Toast.LENGTH_LONG).show();
                
            }
        });
 
    }
}

но когда пытаюсь внедрить себе - ничего не выходит. + все примеры с setOnItemClickListener, а я хочу его поставить что бы выводилось не как сейчас в виде:
"Wolfgang Amadeus Mozart, mozart - sinfonia no.40, 03:45, http://cdndl.zaycev.net/108175/211683/wolfgang_amadeus_mozart_-_mozart_-_sinfonia_no.40_(zaycev.net).mp3",а выводилось в listView как:"Wolfgang Amadeus Mozart, mozart - sinfonia no.40, 03:45" и OnClickListener при нажатии скачивал трек по ссылке.
Просто не могу понять саму структуру и саму архитектуру...
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
22.08.2016, 13:02 #14
JavJun, могу вам посоветовать 100% рабочий вариант из моего продакшна, который я описал в этом посте,но там у меня постоянно сервис висит в фоне, не знаю подойдет ли он вам
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
22.08.2016, 13:22 #15
REALIST07, сам AsyncTask не использовал, но из минусов силой воображения предполагаю что Паблито имеет ввиду проблему возврата из задачи в активити стоящую на паузе или вообще уничтоженную + проблему параллельного выполнения задач
0
JavJun
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
22.08.2016, 16:20  [ТС] #16
Перепробовал с Handler'ом все что смог найти - так ничего и не вышло. Ладно, буду пока делать кликабельным viewlist...

Добавлено через 23 минуты
Добавил setOnItemClickListener из элементарного примера, и теперь у меня вообще "FATAL EXCEPTION"...=/
Кликните здесь для просмотра всего текста
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
 @Override
    protected void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        eText = (EditText) findViewById(R.id.editText1);
        btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                userRequest = eText.getText().toString();
                // определение данных
                lv = (ListView) findViewById(R.id.listView1);
                // запрос к нашему отдельному поток на выборку данных
                new NewThread().execute();
                titleList.clear();
                // Добавляем данные для ListView
                adapter = new ArrayAdapter<>(MainActivity.this, R.layout.list_item, R.id.product_name, titleList);
 
            }
        });
 
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Object listItem = lv.getItemAtPosition(position);
                Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " + id);
            }
        });
 
    }
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
22.08.2016, 16:26 #17
JavJun, пример с Handler (гусары, не кидайте сапогами)
1 App
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
public class App extends Application {
    public static final int interval = 100;
 
    public static Thread thread = null;
    public static boolean processed = true; 
    
    public static void waitForThread(Thread thread) {
        if (thread != null) {
            try {
                thread.join();
            } catch (InterruptedException e) {
            }
        }
    }
 
    public static void interrupt(Thread thread) {
        if (thread != null) {
            thread.interrupt();
        }
    }
    
    public static void clean(Handler handler) {
        if (thread != null && thread.isAlive()) {
            interrupt(thread);
            waitForThread(thread);
        }
        processed = true;
        if (handler != null) {
            handler.removeMessages(0);
        }
    }
 
    public static void startThread() {
        thread = new Thread(new Runnable() {
            public void run() {
                //поток работает и складывает данные в статику App
            }
        });
        thread.start();
    }
}
2 MyActivity
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
public class MyActivity extends Activity {
    private Handler handler;
    
    ...
    @Override
    public void onClick(View arg0) {
        App.clean(handler);
        
        App.startThread();
        App.processed = false;
        handler.sendEmptyMessage(0);
    }
    ...
    
    @Override
    protected void onPause () {
        super.onPause();
 
        handler.removeMessages(0);
    }
    
    @Override
    protected void onResume () {
        super.onResume();
        
        handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                if (!App.thread.isAlive()) {
                    App.processed = true;
                    
                    //когда поток отработал берем данные из статики App и показываем пользователю
                } else {
                    //если поток еще не отработал, то мы все равно можем взять то что уже готово прямо здесь
                    
                    handler.sendEmptyMessageDelayed(0, App.interval);
                }
            }
        };
        if (!App.processed) {
            handler.sendEmptyMessage(0);
        }
    }
}
Добавлено через 3 минуты
только аккуратнее с данными что бы не попасть в них одновременно с потоком
0
22.08.2016, 16:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2016, 16:26
Привет! Вот еще темы с решениями:

Передача данных между активностями
к примеру есть 2 активности первая public class first_act extends Activity {...

Передача данных между активити
как сделать так чтобы при нажатии на кнопку в первом активити изменялись данные...

Передача данных между Активити
Все никак не могу разобраться, как передавать данные между активити? я до этого...

Передача данных между тремя Activity
Доброго времени суток! у меня тут проблемка, связанная с Intent'ами, помогите...


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

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

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