Урок 87. AsyncTask. Параметры. Промежуточные результаты

Обсуждение уроков
Ответить
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение damager82 » 13 июн 2012, 23:00

В этом уроке:
- используем параметры
- выводим промежуточные результаты 


Click here to read this article!
Последний раз редактировалось damager82 20 май 2017, 20:10, всего редактировалось 5 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение rezak90 » 17 июл 2012, 13:43

есть вопросик на счёт промежуточных результатов, такая вот проблемка возникла: в AsyncTask'e запускаю SAX-парсер

Код: Выделить всё

saxParser.parse(bais, handler, content);
так вот парсер реализован в отдельном классе, как мне выводить промежуточные результаты? в парсере происходит добавление в данные для адаптера:

Код: Выделить всё

mypackage.mytest.namespace.RssItemListActivity.items.add(new RssItemFull(title,  sdf.format(new Date(getFormattedTime(pubDate))),
					description, link, fulltext, enclosure, mypackage.mytest.namespace.RssItemListActivity.sPrefEncoding));
З.Ы. пробовал сделать адаптер общедоступным и в классе парсера делать notifyDataSetChanged() но приложуха зависает и всё.
R.id.team
Политика на форуме запрещена

Evilleks
Сообщения: 6
Зарегистрирован: 04 мар 2013, 21:02

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Evilleks » 26 май 2013, 15:53

Здравствуйте. Мне нужно вывести в ProgressDialog прогресс шифрования/дешифрования файла. Никогда раньше не работал с потоками,посоветовали использовать AsyncTask. Но я так и не могу понять. Как мне в doInBackground засунуть метод шифрования и дешифрования. При нажатии на какой либо файл у меня появляется Диалог со списком,при нажатии шифровать(case :1) вызываем метод из класса AES, аналогично для дешифрования(case :2).Как мне связать это с AsyncTask и ProgressDialog?

Код: Выделить всё

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle(R.string.app_name);
            builder.setIcon(R.drawable.ic_launcher);
            builder.setItems(mColors, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item) {
                    Intent intent = getIntent();
                    String key = intent.getStringExtra("fpass"); // encrypt
                    final AES ae = new AES(key);

                    switch (item) {
                    case 0:
                        // open
                        String mime = gi.get_mime_by_filename(aDirectory
                                .getAbsolutePath());
                        Intent intent1 = new Intent();
                        intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        intent1.setAction(android.content.Intent.ACTION_VIEW);
                        intent1.setDataAndType(Uri.fromFile(new File(aDirectory
                                .getAbsolutePath())), mime);

                        try {
                            startActivity(intent1);
                        } catch (ActivityNotFoundException e) {
                            Toast.makeText(getApplicationContext(),
                                    "Couldn't open: unknown file type",
                                    Toast.LENGTH_SHORT).show();
                        }
                        break;
                    case 1:
                             try { 
                              ae.encrypt( new FileInputStream(aDirectory
                              .getAbsoluteFile()), new
                              FileOutputStream(sdPathEN + "/" +
                              aDirectory.getName())); } 
                    catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                        break;
                    case 2:

                        try {

                            ae.decrypt(
                                    new FileInputStream(aDirectory
                                            .getAbsolutePath()),
                                    new FileOutputStream(sdPathDE + "/"
                                            + aDirectory.getName()));
                        } catch (FileNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        break;
                    case 3:
                        // delete
                        aDirectory.delete();

                        break;
                    }
                    dialog.cancel();
                }
            });

            builder.setCancelable(true);
            builder.create();
            builder.show();
        }
Ниже идет метод который находится в классе AES, который я и вызываю в первом и во втором пункте switch:

Код: Выделить всё

public void decrypt(InputStream in, OutputStream out) {

    try {
        // TODO Auto-generated method stub

        // Bytes read from in will be decrypted
        in = new CipherInputStream(in, dcipher);

        // Read in the decrypted bytes and write the cleartext to out
        int numRead = 0;

        while ((numRead = in.read(buf)) >= 0) {

            out.write(buf, 0, numRead);

        }

        out.close();

    } catch (java.io.IOException e) {
        e.printStackTrace();
    }
}

public void encrypt(InputStream in, OutputStream out) {
    try {
        // Bytes written to out will be encrypted
        out = new CipherOutputStream(out, ecipher);

        // Read in the cleartext bytes and write to out to encrypt
        int numRead = 0;
        while ((numRead = in.read(buf)) >= 0) {

            out.write(buf, 0, numRead);
        }
        out.close();
    } catch (java.io.IOException e) {
        e.printStackTrace();
    }
}

Romillionaire
Сообщения: 7
Зарегистрирован: 28 июн 2013, 11:26

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Romillionaire » 06 авг 2013, 12:10

Подскажите пожалуйста почему в методах onPreExecute и onPostExecute не работает publishProgress.TextView не меняется.

Код: Выделить всё

package com.example.test;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
	MyTask mt;
	TextView textView;
	String [] doInBackgroundArray = { "doInBackground 1", "doInBackground 2","doInBackground 3" };
	String [] onPreExecuteArray = {"onPreExecute 1","onPreExecute 2","onPreExecute 2"};
	String [] onPostExecuteArray = {"onPostExecute 1","onPostExecute 2","onPostExecute 2"};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		textView = (TextView) findViewById(R.id.textView);

	}

	public void startAsycnTask(View v) {
		mt = new MyTask();
		mt.execute();
	}

	class MyTask extends AsyncTask<Void, String, Void> {

		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			
			for (int i = 0; i < onPreExecuteArray.length; i++) {
				publishProgress(onPreExecuteArray[i]);
				//textView.setText(onPreExecuteArray[i]);
				SystemClock.sleep(1000);
			}

		}

		@Override
		protected Void doInBackground(Void... params) {
			for (int i = 0; i < doInBackgroundArray.length; i++) {
				publishProgress(doInBackgroundArray[i]);
				SystemClock.sleep(500);
			}

			return null;
		}

		@Override
		protected void onProgressUpdate(String... values) {
			super.onProgressUpdate(values);
			textView.setText(values[0]);
		}

		@Override
		protected void onPostExecute(Void result) {
			super.onPostExecute(result);
			for (int i = 0; i < onPostExecuteArray.length; i++) {
				publishProgress(onPostExecuteArray[i]);
				//textView.setText(onPostExecuteArray[i]);
				SystemClock.sleep(1000);
			}
		}

	}

}
Последний раз редактировалось Romillionaire 07 авг 2013, 17:31, всего редактировалось 1 раз.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Mikhail_dev » 06 авг 2013, 12:13

Поместите исходники в необходимые теги. Читать так код нет никакого желания.

timur90
Сообщения: 5
Зарегистрирован: 10 авг 2013, 03:52

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение timur90 » 11 авг 2013, 23:56

Спасибо за уроки.

Аватара пользователя
Nialon
Сообщения: 22
Зарегистрирован: 12 ноя 2013, 19:19

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Nialon » 02 дек 2013, 20:44

Замучился с конструкцией. Может справку не понял.
Можно передать в поток несколько входных параметров? Одного мало.
Если да, то как? Имею: DatabaseConnector + ListView и т.д

Или можно объединить их каким-то образом в одну запись и передать одним параметром?

т.е все упирается в public final AsyncTask<Params, Progress, Result> execute(Params... params)

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение trew » 02 дек 2013, 21:07

Nialon писал(а):Замучился с конструкцией. Может справку не понял.
Можно передать в поток несколько входных параметров? Одного мало.
Если да, то как? Имею: DatabaseConnector + ListView и т.д

Или можно объединить их каким-то образом в одну запись и передать одним параметром?

т.е все упирается в public final AsyncTask<Params, Progress, Result> execute(Params... params)
Может через Parсel, уроки 68-69.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
Nialon
Сообщения: 22
Зарегистрирован: 12 ноя 2013, 19:19

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Nialon » 02 дек 2013, 22:03

Гадство, класс как параметр поток не принимает. И еще он есть лишь doInBackground ..
Пойду смотреть Парселябрию. Спасибо. Насчет "I,C" - я их потом убрал для проверки ..
Вложения
asth.png
asth.png (22.84 КБ) 17060 просмотров

Savotii
Сообщения: 10
Зарегистрирован: 16 дек 2013, 17:35

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Savotii » 15 янв 2014, 16:19

Добрый день, подскажите пожалуйста.
Есть программка с реализацией отправки на фтп, делал через сервис.
Однако спустя какое-то время, когда экран темнеет и уходит в спячку, передача перестает проходить, проверяю через FileZilla.
Что посоветуете?Как бороться. Чтобы даже при спячке , сервис отрабатывал как нужно?
Спасибо.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение KamiSempai » 15 янв 2014, 16:55

Используйте PowerManager.WakeLock.
Как им пользоваться полно примеров в интернете.
Суть проста, перед началом запрашивается разрешение на предотвращение ухода в спящий режим методом acquire().
После выполнения нужных действий ОБЯЗАТЕЛЬНО нужно проинформировать о том, что в спящий режим можно уходить. Делается это через метод release().
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Savotii
Сообщения: 10
Зарегистрирован: 16 дек 2013, 17:35

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Savotii » 15 янв 2014, 21:08

Спасибо. А вот других вариантов нет? Ведь сервис должен какбы работать в фоне ? даже если активити не активити?
Или я чего не понимаю.

Savotii
Сообщения: 10
Зарегистрирован: 16 дек 2013, 17:35

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Savotii » 15 янв 2014, 22:29

Меня вот что интересует, моменты со всякими notification, которые подают звуки , когда экран выключен. Они же как-то просыпаются? Возможно ли реализовать на подобной основе выгрузку?
Кто подскажет, в каком направлении курить?
Спасибо.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение KamiSempai » 16 янв 2014, 11:37

Savotii писал(а):Спасибо. А вот других вариантов нет?
Чем этот не угодил? Используйте флаг PARTIAL_WAKE_LOCK тогда CPU будет работать даже при выключенном экране.
Кстати, если верить документации, это единственный вариант кода CPU не отправляется в спячку при нажатии кнопки Power.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Digetix » 17 янв 2014, 00:37

Подскажите, пожалуйста, как правильно сделать такое

Код: Выделить всё

class MyTask extends AsyncTask<Void, Void, Void> { 

	    @Override
	    protected void onPreExecute() {
	      super.onPreExecute();
	           dialog.show();
	    }

	    @Override
	    protected Void doInBackground(Void... params) {
	    	
	    				StringBuffer sb = new StringBuffer();
	    				BufferedReader br = null;
	    				try {
	    					br = new BufferedReader(new InputStreamReader(getAssets().open("example.txt")));
	    					String temp;
	    					while ((temp = br.readLine()) != null)
	    						sb.append(temp);
	    				} catch (IOException e) {
	    					e.printStackTrace();
	    				} finally {
	    					try {
	    						br.close(); 
	    					} catch (IOException e) {
	    						e.printStackTrace();
	    					}
	    				}

	    				String myjsonstring = sb.toString();
	    				try {

	    					JSONObject jsonObjMain = new JSONObject(myjsonstring);
	    					JSONArray jsonArray = jsonObjMain.getJSONArray("results");
	    					
	    					for (int i = 0; i < jsonArray.length(); i++) {
	    						JSONObject jsonObj = jsonArray.getJSONObject(i);
	    						String name = jsonObj.getString("adress");    						
	    						JSONObject c = jsonArray.getJSONObject(i);
	    						JSONObject phone = c.getJSONObject("location");
	    						String lat = phone.getString("latitude");
	    						String lon = phone.getString("longitude");

	    						dLat=Double.parseDouble(lat);
	    						dLon=Double.parseDouble(lon);	    						
	    					}

	    				} catch (JSONException e) {
	    					e.printStackTrace();
	    				}
	      return null;
	    }

	    @Override
	    protected void onPostExecute(Void result) {
	      super.onPostExecute(result);
	      myMap.addMarker(new MarkerOptions().position(new LatLng(dLat, dLon)).title(name));
	      dialog.dismiss();

	    }
	  }
При таком коде ничего не происходит

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение KamiSempai » 17 янв 2014, 14:06

Сложно сказать. Вы показали не весь код. Но я сейчас уже могу сделать замечание. Координаты парсятся в цикле, значит их должно быть несколько, а вы используете только последние данные, которые остаются после прохождения всех строк.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Digetix » 17 янв 2014, 22:50

KamiSempai писал(а):Вы показали не весь код
Выше код создания активити, меню и карты myMap
KamiSempai писал(а): Координаты парсятся в цикле, значит их должно быть несколько
Как это несколько? 2 координаты, широта и долгота, и плюс там идёт одна строка

Savotii
Сообщения: 10
Зарегистрирован: 16 дек 2013, 17:35

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Savotii » 18 янв 2014, 00:15

KamiSempai писал(а):
Savotii писал(а):Спасибо. А вот других вариантов нет?
Чем этот не угодил? Используйте флаг PARTIAL_WAKE_LOCK тогда CPU будет работать даже при выключенном экране.
Кстати, если верить документации, это единственный вариант кода CPU не отправляется в спячку при нажатии кнопки Power.
Спасибо , как-нибудь , когда приведу основной код в состояние более - менее качественно скомпанованного, попробую,
на текущий момент ограничился startForeground(), вроде бы работает, запущу на ночь, если все гуд ,оставлю в текущей реализации.
Если нет, будем шаманить.
Спасибо.

Savotii
Сообщения: 10
Зарегистрирован: 16 дек 2013, 17:35

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение Savotii » 18 янв 2014, 10:00

При варианте с notification и повышение приоритета сервиса путем startForeground() , все работает.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 87. AsyncTask. Параметры. Промежуточные результаты

Сообщение doter.ua » 21 мар 2015, 11:39

Настраивать вью можно только из мейн треда.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Ответить