Страница 1 из 1

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

Добавлено: 13 июн 2012, 23:00
damager82
В этом уроке:
- используем параметры
- выводим промежуточные результаты 


Click here to read this article!

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

Добавлено: 17 июл 2012, 13:43
rezak90
есть вопросик на счёт промежуточных результатов, такая вот проблемка возникла: в 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() но приложуха зависает и всё.

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

Добавлено: 26 май 2013, 15:53
Evilleks
Здравствуйте. Мне нужно вывести в 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();
    }
}

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

Добавлено: 06 авг 2013, 12:10
Romillionaire
Подскажите пожалуйста почему в методах 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);
			}
		}

	}

}

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

Добавлено: 06 авг 2013, 12:13
Mikhail_dev
Поместите исходники в необходимые теги. Читать так код нет никакого желания.

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

Добавлено: 11 авг 2013, 23:56
timur90
Спасибо за уроки.

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

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

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

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

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

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

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

т.е все упирается в public final AsyncTask<Params, Progress, Result> execute(Params... params)
Может через Parсel, уроки 68-69.

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

Добавлено: 02 дек 2013, 22:03
Nialon
Гадство, класс как параметр поток не принимает. И еще он есть лишь doInBackground ..
Пойду смотреть Парселябрию. Спасибо. Насчет "I,C" - я их потом убрал для проверки ..

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

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

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

Добавлено: 15 янв 2014, 16:55
KamiSempai
Используйте PowerManager.WakeLock.
Как им пользоваться полно примеров в интернете.
Суть проста, перед началом запрашивается разрешение на предотвращение ухода в спящий режим методом acquire().
После выполнения нужных действий ОБЯЗАТЕЛЬНО нужно проинформировать о том, что в спящий режим можно уходить. Делается это через метод release().

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

Добавлено: 15 янв 2014, 21:08
Savotii
Спасибо. А вот других вариантов нет? Ведь сервис должен какбы работать в фоне ? даже если активити не активити?
Или я чего не понимаю.

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

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

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

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

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

Добавлено: 17 янв 2014, 00:37
Digetix
Подскажите, пожалуйста, как правильно сделать такое

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

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();

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

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

Добавлено: 17 янв 2014, 14:06
KamiSempai
Сложно сказать. Вы показали не весь код. Но я сейчас уже могу сделать замечание. Координаты парсятся в цикле, значит их должно быть несколько, а вы используете только последние данные, которые остаются после прохождения всех строк.

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

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

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

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

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

Добавлено: 18 янв 2014, 10:00
Savotii
При варианте с notification и повышение приоритета сервиса путем startForeground() , все работает.

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

Добавлено: 21 мар 2015, 11:39
doter.ua
Настраивать вью можно только из мейн треда.