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

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

Войти
Регистрация
Восстановить пароль
 
JavJun
12 / 10 / 3
Регистрация: 27.08.2015
Сообщений: 236
#1

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

21.08.2016, 22:43. Просмотров 512. Ответов 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);
        }
    }
}



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

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

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

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

Передача данных между активностями - Программирование Android
к примеру есть 2 активности первая public class first_act extends Activity { @Override protected void onCreate(Bundle...

Передача данных между ListView - Программирование Android
Доброго времени суток форумчане! Не получается решить одну проблему, надеюсь на вашу помощь. В классе фрагмента есть метод onCreateView,...

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

Передача данных между tab Activities - Программирование Android
как обмениваться данными между tab - вкладками, если учесть, что tab вкладки не в главном activity, это не помогло...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 653
21.08.2016, 23:01     Передача данных между потоками #2
JavJun, работу с сетью, на мой взгляд, лучше перенести в IntentService, а информацию между потоками и между компонентами удобно передавать через EventBus
vxg
Модератор
3140 / 1942 / 214
Регистрация: 13.01.2012
Сообщений: 7,429
22.08.2016, 09:26     Передача данных между потоками #3
JavJun, AsyncTask вроде имеет метод вызываемый периодически по мере продвижения прогресса - вот в этом методе и обновляйте список если поменялось количество добавленных треков
Pablito
22.08.2016, 10:46
  #4

Не по теме:

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

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

Не по теме:

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

Mikalai
22.08.2016, 11:43
  #8

Не по теме:


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

Pablito
2455 / 1900 / 591
Регистрация: 12.05.2014
Сообщений: 6,702
Завершенные тесты: 1
22.08.2016, 11:52     Передача данных между потоками #9
Цитата Сообщение от REALIST07 Посмотреть сообщение
сначала дайте ссылку на совет, и поясните что не так
не всегда есть желание пояснять очевидные вещи, в твоем сообщении тоже нет ссылок

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

Не по теме:

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

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

Не по теме:

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

REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
22.08.2016, 12:36     Передача данных между потоками #12
Паблито,

Не по теме:

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

JavJun
12 / 10 / 3
Регистрация: 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 при нажатии скачивал трек по ссылке.
Просто не могу понять саму структуру и саму архитектуру...
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
22.08.2016, 13:02     Передача данных между потоками #14
JavJun, могу вам посоветовать 100% рабочий вариант из моего продакшна, который я описал в этом посте,но там у меня постоянно сервис висит в фоне, не знаю подойдет ли он вам
vxg
Модератор
3140 / 1942 / 214
Регистрация: 13.01.2012
Сообщений: 7,429
22.08.2016, 13:22     Передача данных между потоками #15
REALIST07, сам AsyncTask не использовал, но из минусов силой воображения предполагаю что Паблито имеет ввиду проблему возврата из задачи в активити стоящую на паузе или вообще уничтоженную + проблему параллельного выполнения задач
JavJun
12 / 10 / 3
Регистрация: 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);
            }
        });
 
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2016, 16:26     Передача данных между потоками
Еще ссылки по теме:

Передача данных между тремя Activity - Программирование Android
Доброго времени суток! у меня тут проблемка, связанная с Intent'ами, помогите разобраться. Есть 3 активности: MainActivity, SearchActivity...

Передача данных между tab Activities - Программирование Android
Возможно ли обмениваться данными между tab вкладками(Активностями иначе говоря), допустим в одной активности EditText, ввели туда...

Socket соединение между ПК и Планшетом и передача данных - Программирование Android
Доброго времени суток! Создаю socket соединение между ПК и планшетом: ПК - программа сервер (программа написана на Delphi -...

Передача данных между двумя телефонами Android + Content Provider - Программирование Android
Добрый день. Подскажите, пожалуйста, есть телефон на нём установлена программа, в данной программе есть Content Provider. Можно ли по...

Синхронизация между потоками - Программирование Android
Вот, например у меня есть основной Ui поток и поток Thread который он породил. И Tread меняет какую то переменную (ну или массив целый) и я...


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

Или воспользуйтесь поиском по форуму:
vxg
Модератор
3140 / 1942 / 214
Регистрация: 13.01.2012
Сообщений: 7,429
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 минуты
только аккуратнее с данными что бы не попасть в них одновременно с потоком
Yandex
Объявления
22.08.2016, 16:26     Передача данных между потоками
Ответ Создать тему
Опции темы

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