Урок 91. AsyncTask. Поворот экрана

Обсуждение уроков
3Gern
Сообщения: 25
Зарегистрирован: 30 июл 2012, 13:32

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение 3Gern » 23 дек 2012, 19:31

gera писал(а):Проверяй что вернет getLastNonConfigurationInstance(). Если вернет null, то создай новый объект parse = new Parse().
Если бы ты внимательно читал урок, то заметил бы этот код

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

mt = (MyTask) getLastNonConfigurationInstance();
if (mt == null) {
   mt = new MyTask();
   mt.execute();
}
я так и делал но не получалось потом решил по экспериментировать добавить отсебятины, в общем нашел свою ошибку.

behzodbek
Сообщения: 58
Зарегистрирован: 23 дек 2012, 22:58
Откуда: UZB Namangan

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение behzodbek » 24 дек 2012, 22:13

android:configChanges="keyboardHidden|orientation" кто может рассказать о нем побольше инфы. Спасибо заранее.
Изображение

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

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение rezak90 » 24 дек 2012, 23:54

behzodbek писал(а):android:configChanges="keyboardHidden|orientation" кто может рассказать о нем побольше инфы. Спасибо заранее.
http://stackoverflow.com/questions/7818 ... rientation
R.id.team
Политика на форуме запрещена

3Gern
Сообщения: 25
Зарегистрирован: 30 июл 2012, 13:32

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение 3Gern » 07 янв 2013, 15:14

занимаюсь свободным полетам на основе этого урока, так вот в общем получилось так что у меня два класса, в первой ListView, а во второй вынес экземпляр AsyncTask, так вот теперь не получается запустит прогресдиалог и скрыть ее, ниже код

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

public class MainActivity extends Activity {
	
	static ListView lstView;
	static ProgressDialog pd;
	static ArrayAdapter<String> adapter;
	static List<String> listTitle = new ArrayList<String>();
	Async mt;
	
	@Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        Log.d("qwe", "create MainActivity: " + this.hashCode());
        
        setContentView(R.layout.activity_main);
        
        lstView = (ListView) findViewById (R.id.lvNews);
        
        adapter = new ArrayAdapter<String>(MainActivity.this, 
				R.layout.list_news, listTitle);
		lstView.setAdapter(adapter);
		
		mt = (Async) getLastNonConfigurationInstance();
		if (mt == null)
		{
			mt = new Async();
			mt.execute();
		}
		mt.link(this);
		
		Log.d("qwe", "create MyTask: " + mt.hashCode());
	}
    
	public Object onRetainNonConfigurationInstance()
	{	
		mt.unlink();
		return mt;
	}

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

public class Async extends AsyncTask<Void, Integer, String> {
	
	MainActivity activity;
	
	void link(MainActivity act)
	{
		activity = act;
	}
	
	void unlink()
	{
		activity = null;
	}
	
	protected void onPreExecute()
	{
		MainActivity.pd.show();
		MainActivity.pd.setMessage("work...");
	}
	
	@Override
	protected String doInBackground(Void... params) {
		
		MainActivity.listTitle.clear();
		
		try 
		{
			for(int i=0; i<10; i++)
			{
				TimeUnit.SECONDS.sleep(1);
				publishProgress(i);
			}
		} 
		catch (InterruptedException e) 
		{
				// TODO Auto-generated catch block
				e.printStackTrace();
		}
		return null;
	}
	
	protected void onProgressUpdate(Integer... cnt)
	{
		super.onProgressUpdate(cnt[0]);
		Log.d("qwe", "i = " + cnt[0]
				+ ", MyTask: " + this.hashCode()
				+ ", MainActivity: " + activity.hashCode());
		MainActivity.listTitle.add(cnt[0].toString());
		MainActivity.adapter.notifyDataSetChanged();
	}
	
	protected void onPostExecute()
	{
		MainActivity.pd.dismiss();
	}

}
Последний раз редактировалось 3Gern 07 янв 2013, 16:35, всего редактировалось 1 раз.

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

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение rezak90 » 07 янв 2013, 16:01

боже, как красиво, наименование класса с маленькой буквы, все поля статические))) читаем ещё раз основы ява...
R.id.team
Политика на форуме запрещена

3Gern
Сообщения: 25
Зарегистрирован: 30 июл 2012, 13:32

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение 3Gern » 07 янв 2013, 16:31

rezak90 писал(а):боже, как красиво, наименование класса с маленькой буквы, все поля статические))) читаем ещё раз основы ява...
статическим делал потому что со второго класса с ними работаю, название класса сделал заглавным.

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

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение rezak90 » 07 янв 2013, 20:27

статическим делал потому что со второго класса с ними работаю
и это по вашему правильно? по этому и предложил выучить/повторить ООП и Java
R.id.team
Политика на форуме запрещена

fuck3r
Сообщения: 1
Зарегистрирован: 30 янв 2013, 21:31

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение fuck3r » 30 янв 2013, 21:34

A couple of methods on Activity have been deprecated, so you should no longer use them:
getLastNonConfigurationInstance()
onRetainNonConfigurationInstance()

Так что статья неактуальна, надо переделывать.

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

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение rezak90 » 30 янв 2013, 23:47

если присмотреться внимательней то не мало статей где уже гугл не рекомендует использовать те или иные подходы/методы
R.id.team
Политика на форуме запрещена

Аватара пользователя
kondra007
Сообщения: 91
Зарегистрирован: 23 янв 2013, 14:49

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение kondra007 » 05 фев 2013, 02:39

"Всё пропало, шеф!"
В общем, проблема такая - не работает!
У меня 2 класса - Main и Parser.
При нажатии на кнопку - вызывается новый Parser.

Чисто в теории - как в таком случае сохранить информацию при повороте?

anton9088
Сообщения: 2
Зарегистрирован: 06 мар 2013, 01:28

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение anton9088 » 06 мар 2013, 01:32

почему до сих пор никто не сказал что, все, что описано в статье - костыль и нужно использовать AsyncTaskLoader?

Stas0n
Сообщения: 3
Зарегистрирован: 21 окт 2012, 03:10

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение Stas0n » 07 мар 2013, 01:15

Тут такая ситуация: динамически подгружаю данные и вывожу их в список. Как только прокрутил до конца страницы, подгружаю очередную порцию данных.
Подгрузка идет в AsyncTask, который, в свою очередь находится в setOnScrollListener
Как сделать так, чтобы в такой ситуации поворот экрана не ломал жизнь?

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

		listView.setOnScrollListener(new OnScrollListener() {

			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
				
				int lastScreen = firstVisibleItem + visibleItemCount;

				if ((lastScreen) == totalItemCount) {
					if ((from + number) <= totalItemCount) {
						from = totalItemCount;
						mt = (MyTask) getLastNonConfigurationInstance();
						if ( mt == null ){
						      mt = new MyTask();
						      mt.execute();
						}
					    mt.link(this);
					}
				}
			}
Как исправить? А то падает все это дело

zenit
Сообщения: 13
Зарегистрирован: 03 фев 2013, 22:59

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение zenit » 24 мар 2013, 09:43

Добрый день! Как делать все то же самое что показано в этом уроке но на Androide 3.0 и выше. Общеизвестно что на 3.0 и выше методы getLastNonConfigurationInstance()
onRetainNonConfigurationInstance()
, который используется в этом уроке НЕ ВЫЗЫВАЕТСЯ т.к. устарел. Тогда как делать поворот экрана с сохранением AsyncTask на андроиде 3.0 и выше без поддержки этих методов?

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

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение damager82 » 10 апр 2013, 13:35

zenit писал(а):Добрый день! Как делать все то же самое что показано в этом уроке но на Androide 3.0 и выше. Общеизвестно что на 3.0 и выше методы getLastNonConfigurationInstance()
onRetainNonConfigurationInstance()
, который используется в этом уроке НЕ ВЫЗЫВАЕТСЯ т.к. устарел. Тогда как делать поворот экрана с сохранением AsyncTask на андроиде 3.0 и выше без поддержки этих методов?
Если метод устарел, это не значит, что он не вызывается. Просто, вместо него рекомендуется использовать свойство retainInstance у фрагментов.

А тут еще выше человек написал, что можно использовать AsyncTaskLoader. Я с Loader-ами вообще еще не сталкивался. Кто-нибудь может подтвердить или опровергнуть?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Remie
Сообщения: 19
Зарегистрирован: 26 июл 2013, 20:09

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение Remie » 26 июл 2013, 20:25

Привет всем.
Я знаю, что сильно туплю, но учу Андроид только третий день.
Попробовала сделать поворот экрана в AsyncTask в своем проекте, но после этого приложение перестало запускаться.
Где я ошибаюсь?

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

package com.gmail.remielk.gamecli;

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

public class MainActivity extends Activity {
	ParseMyPageTask mt;
TextView tvInfo;
WebView webview;

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);


  mt = (ParseMyPageTask) getLastNonConfigurationInstance();
  if (mt == null) {
    mt = new ParseMyPageTask();
    mt.execute();
  }
  // передаем в MyTask ссылку на текущее MainActivity
  mt.link(this);

  
  tvInfo = (TextView) findViewById(R.id.textView1);
  webview = (WebView) findViewById(R.id.webView1);
  new ParseMyPageTask()
  .execute("http://mysite.com/");
  webview.setWebViewClient(new ForumWebViewClient());
}

////////////////////////////

public Object onRetainNonConfigurationInstance() {
    // удаляем из MyTask ссылку на старое MainActivity
    mt.unLink();
    return mt;
  }

////////////////////////////
class ParseMyPageTask extends AsyncTask<String, Void, String> {
	MainActivity activity;
    // получаем ссылку на MainActivity
    void link(MainActivity act) {
      activity = act;
    }
    
    // обнуляем ссылку
    void unLink() {
      activity = null;
    }

	
  @Override
  protected String doInBackground(String... params) {
   Document doc = null;
   String htmltext = "";
   try {
        doc = Jsoup.connect(params[0]).get();
        Element warning = doc.select("body").first();
        htmltext = warning.html();
   } catch (IOException e) {
        e.printStackTrace();
   }

   return htmltext;
  }
  @Override
  protected void onPostExecute(String result) {
   super.onPostExecute(result);

   webview.loadDataWithBaseURL(null, "<head><link rel=\"stylesheet\" type=\"text/css\" href=\"file:///android_asset/styles/black.css\"></head><body>" + result + "</body>", "text/html", "UTF-8", null);
  }
}

////////////////////////////////////

private class ForumWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
    	new ParseMyPageTask()
    	  .execute("https://mysite.com/" + url);
    	return true;
    }
}


/////////////////////////////////////////

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
	if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
		webview.goBack();
		return true;
	}
	return super.onKeyDown(keyCode, event);
}

///////////////////////////////////////////

@Override
public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
}

}
Ошибки в логе

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

07-26 20:22:21.563: E/AndroidRuntime(1797): FATAL EXCEPTION: AsyncTask #2
07-26 20:22:21.563: E/AndroidRuntime(1797): java.lang.RuntimeException: An error occured while executing doInBackground()
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at android.os.AsyncTask$3.done(AsyncTask.java:299)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at java.lang.Thread.run(Thread.java:856)
07-26 20:22:21.563: E/AndroidRuntime(1797): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.doInBackground(MainActivity.java:70)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.doInBackground(MainActivity.java:1)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-26 20:22:21.563: E/AndroidRuntime(1797): 	... 5 more

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

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение rezak90 » 26 июл 2013, 20:40

Remie
ArrayIndexOutOfBoundsException говорит о том что выход за пределы границы массива/коллекции... происходит это где то в doInBackground()
могу лишь предположить что на этих строках,

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

doc = Jsoup.connect(params[0]).get(); 
Element warning = doc.select("body").first(); 
так что проверяйте
R.id.team
Политика на форуме запрещена

Remie
Сообщения: 19
Зарегистрирован: 26 июл 2013, 20:09

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение Remie » 26 июл 2013, 21:04

rezak90 писал(а):Remie
могу лишь предположить что на этих строках,

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

doc = Jsoup.connect(params[0]).get(); 
Element warning = doc.select("body").first(); 
До того, как я встроила код урока, парсинг и вывод страницы проходил без ошибок. Хотя, может я не правильно поняла?
Еще getLastNonConfigurationInstance() отображается ПЕРЕчеркнутым, так и должно быть?

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

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение Mikhail_dev » 26 июл 2013, 21:10

Remie, а как у вас дела обстоят с языком Java?

Remie
Сообщения: 19
Зарегистрирован: 26 июл 2013, 20:09

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение Remie » 26 июл 2013, 21:14

no-- писал(а):Remie, а как у вас дела обстоят с языком Java?
Немного читаю c++, java изучаю в процессе обучения программированию под Андроид.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 91. AsyncTask. Поворот экрана

Сообщение Foenix » 26 июл 2013, 21:30

no-- писал(а):Remie, а как у вас дела обстоят с языком Java?
ты в репетиторы набиваешься? :roll:
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить