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

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

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

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

Почитайте основы Java, по книге: Хорстманн том 1 Основы. Андроид учить с Java параллельно будет утомительно трудно. Считайте, что андроид - это надстройка над языком. Вы не сможете нормально учить эту надстройку, когда надо знать то, что снизу, под ней.

Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

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

Сообщение shtil » 25 авг 2013, 12:58

Копирую код с урока, в MyTask добавляю метод

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

  @Override
		protected void onPreExecute() {			
			super.onPreExecute();
			Log.d("qwe", "create onPreExecute: " + activity.hashCode());
			
		}
И приложение начинает вылетать при запуске. Второй день мучаюсь, подскажите, в чем может быть причина?
В LogCat'е вот что пишет...

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

08-25 09:53:41.439: E/AndroidRuntime(1696): FATAL EXCEPTION: main
08-25 09:53:41.439: E/AndroidRuntime(1696): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.p0911_asynctaskrotate/com.example.p0911_asynctaskrotate.MainActivity}: java.lang.NullPointerException
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at android.os.Handler.dispatchMessage(Handler.java:99)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at android.os.Looper.loop(Looper.java:123)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at android.app.ActivityThread.main(ActivityThread.java:4627)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at java.lang.reflect.Method.invokeNative(Native Method)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at java.lang.reflect.Method.invoke(Method.java:521)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at dalvik.system.NativeStart.main(Native Method)
08-25 09:53:41.439: E/AndroidRuntime(1696): Caused by: java.lang.NullPointerException
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at com.example.p0911_asynctaskrotate.MainActivity$MyTask.onPreExecute(MainActivity.java:75)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at android.os.AsyncTask.execute(AsyncTask.java:391)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at com.example.p0911_asynctaskrotate.MainActivity.onCreate(MainActivity.java:27)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-25 09:53:41.439: E/AndroidRuntime(1696): 	... 11 more


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

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

Сообщение rezak90 » 25 авг 2013, 13:09

shtil писал(а):И приложение начинает вылетать при запуске. Второй день мучаюсь, подскажите, в чем может быть причина?
вот ответ:
shtil писал(а):Копирую код с урока
R.id.team
Политика на форуме запрещена

Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

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

Сообщение shtil » 25 авг 2013, 13:56

rezak90 писал(а):
shtil писал(а):И приложение начинает вылетать при запуске. Второй день мучаюсь, подскажите, в чем может быть причина?
вот ответ:
shtil писал(а):Копирую код с урока
Что то не вкурил ответ... Конкретнее можно?

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

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

Сообщение rezak90 » 25 авг 2013, 14:42

Я хотел сделать акцент на то что нужно понимать то что копируешь, куда и зачем. NullPointerException говорит о том что объект не проинициализирован, а ты к нему обращаешься.
R.id.team
Политика на форуме запрещена

Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

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

Сообщение shtil » 25 авг 2013, 15:17

rezak90 писал(а):Я хотел сделать акцент на то что нужно понимать то что копируешь, куда и зачем. NullPointerException говорит о том что объект не проинициализирован, а ты к нему обращаешься.
Да, я это понял.. Не мог понять на какой именно объект матерится. Оказывается, я не передал ссылку на текущее Activity. Теперь полностью разобрался.
Спасибо за пинок, помогло)

NeoSvet
Сообщения: 11
Зарегистрирован: 19 авг 2013, 20:21

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

Сообщение NeoSvet » 31 авг 2013, 15:08

unLink не нужен, только ошибку может выдать, если переменная класса AsyncTask не была определена до поворота экрана!

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

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

Сообщение Remie » 07 окт 2013, 01:33

Нужна помощь.
Применила урок к своему учебному проекту, но при повороте данные в активити не отображаются.

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

public class MainActivity extends Activity {
	WebView webview;
	String url = "http://...";

	ParseMyPageTask mt;

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

		webview = (WebView) findViewById(R.id.webview);
		
		mt = (ParseMyPageTask) getLastNonConfigurationInstance();
		if (mt == null) {
			mt = new ParseMyPageTask();
			mt.execute(url);
		}
		mt.link(this);
	}

	public Object onRetainNonConfigurationInstance() {
		mt.unLink();
		return mt;
	}

	static 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 result = "";

			try {
				** Тут работает парсер **
			} catch (IOException e) {
				e.printStackTrace();
			}

			return result;
		}

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

			activity.webview.loadDataWithBaseURL("http://...", result, "text/html", "UTF-8", "");

			return;
				}
			}
}
Все ведь, вроде бы, верно? :?

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

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

Сообщение Remie » 07 окт 2013, 01:38

Вот примерный лог

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

10-07 01:34:47.486: V/AsyncTask doInBackground(16008): URL: http:...
10-07 01:34:47.486: V/AsyncTask doInBackground(16008): Result: 
                        *ТУТ МНОГО ПАРСЕННОГО КОДА*
10-07 01:34:47.921: I/GATE(16008): <GATE-M>DEV_ACTION_COMPLETED</GATE-M>
10-07 01:35:00.036: E/webview(16008): removeForStylusPenEvent onDetachedFromWindow
10-07 01:35:00.036: E/webview(16008): removeForStylusPenEvent START
10-07 01:35:00.036: E/webview(16008): removeForStylusPenEvent END
10-07 01:35:00.036: E/webview(16008): removeForStylusPenEvent onDetachedFromWindow
10-07 01:35:00.036: E/webview(16008): removeForStylusPenEvent START
10-07 01:35:00.036: E/webview(16008): removeForStylusPenEvent END
10-07 01:35:00.156: I/webclipboard(16008): clipservice: android.sec.clipboard.ClipboardExManager@426488e0
10-07 01:35:00.161: V/webkit(16008): BrowserFrame constructor: this=Handler (android.webkit.BrowserFrame) {4265f860}
10-07 01:35:00.196: I/webclipboard(16008): clipservice: android.sec.clipboard.ClipboardExManager@426488e0
10-07 01:35:00.201: V/webkit(16008): BrowserFrame constructor: this=Handler (android.webkit.BrowserFrame) {42654740}
10-07 01:35:00.221: D/dalvikvm(16008): GC_CONCURRENT freed 472K, 11% free 13029K/14599K, paused 13ms+2ms, total 53ms
10-07 01:35:00.221: D/dalvikvm(16008): WAIT_FOR_CONCURRENT_GC blocked 14ms
10-07 01:35:00.241: E/webview(16008): registerForStylusPenEvent onAttachedToWindow
10-07 01:35:00.241: E/webview(16008): registerForStylusPenEvent START
10-07 01:35:00.241: E/webview(16008): registerForStylusPenEvent END
10-07 01:35:00.241: E/webview(16008): registerForStylusPenEvent onAttachedToWindow
10-07 01:35:00.241: E/webview(16008): registerForStylusPenEvent START
10-07 01:35:00.241: E/webview(16008): registerForStylusPenEvent END
10-07 01:35:00.291: D/WebView(16008): onSizeChanged - w:1280 h:80
10-07 01:35:00.296: D/WebView(16008): onSizeChanged - w:1280 h:670
10-07 01:35:00.296: W/IInputConnectionWrapper(16008): showStatusIcon on inactive InputConnection
10-07 01:35:00.296: W/IInputConnectionWrapper(16008): showStatusIcon on inactive InputConnection
10-07 01:35:07.606: V/myLogs(16008): onBackPressed
10-07 01:35:08.961: W/IInputConnectionWrapper(16008): showStatusIcon on inactive InputConnection

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

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

Сообщение Remie » 09 окт 2013, 17:20

Ммм.. никто не видит, в чем может быть причина ошибки или в эту тему никто не заглядывает?

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

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

Сообщение KamiSempai » 10 окт 2013, 11:22

Скорее всего в момент поворота экрана AsyncTask завершил свою работу и onPostExecute уже отработал. Вам нужно проверить это в onCreate, и в случае чего можно повторно вызвать onPostExecute.

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

    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
 
        webview = (WebView) findViewById(R.id.webview); 
         
        mt = (ParseMyPageTask) getLastNonConfigurationInstance(); 
        if (mt == null) { 
            mt = new ParseMyPageTask(); 
            mt.execute(url); 
        } 
        mt.link(this);

        if(mt.getStatus() == AsyncTask.Status.FINISHED)
                mt.onPostExecute(mt.get());
    } 
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

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

Сообщение Remie » 10 окт 2013, 19:47

KamiSempai, спасибо! помогло)
Но обнаружилась еще одна проблема - при переходе по ссылке в webview вылазит

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

10-10 19:49:19.966: W/dalvikvm(4893): threadid=17: thread exiting with uncaught exception (group=0x411622a0)
10-10 19:49:19.976: E/AndroidRuntime(4893): FATAL EXCEPTION: AsyncTask #3
10-10 19:49:19.976: E/AndroidRuntime(4893): java.lang.RuntimeException: An error occured while executing doInBackground()
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at android.os.AsyncTask$3.done(AsyncTask.java:299)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at java.lang.Thread.run(Thread.java:856)
10-10 19:49:19.976: E/AndroidRuntime(4893): Caused by: java.lang.NullPointerException
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.doInBackground(MainActivity.java:140)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.doInBackground(MainActivity.java:1)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-10 19:49:19.976: E/AndroidRuntime(4893): 	... 5 more

в onCreate пишу так:

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

webview.setWebViewClient(new WebViewClient() {
			// @Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				mt = new ParseMyPageTask();
				mt.execute(url);
				return true;
			}
		});
Не пойму, что ему не нравится, я ведь создаю Новую задачу. Прошлая уже не должна оставаться в памяти..

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

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

Сообщение KamiSempai » 10 окт 2013, 21:19

Все предельно ясно, NullPointerException в 140 строке.
Remie писал(а):10-10 19:49:19.966: W/dalvikvm(4893): threadid=17: thread exiting with uncaught exception (group=0x411622a0)
10-10 19:49:19.976: E/AndroidRuntime(4893): FATAL EXCEPTION: AsyncTask #3
10-10 19:49:19.976: E/AndroidRuntime(4893): java.lang.RuntimeException: An error occured while executing doInBackground()
10-10 19:49:19.976: E/AndroidRuntime(4893): at android.os.AsyncTask$3.done(AsyncTask.java:299)
10-10 19:49:19.976: E/AndroidRuntime(4893): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-10 19:49:19.976: E/AndroidRuntime(4893): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-10 19:49:19.976: E/AndroidRuntime(4893): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-10 19:49:19.976: E/AndroidRuntime(4893): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-10 19:49:19.976: E/AndroidRuntime(4893): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-10 19:49:19.976: E/AndroidRuntime(4893): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-10 19:49:19.976: E/AndroidRuntime(4893): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-10 19:49:19.976: E/AndroidRuntime(4893): at java.lang.Thread.run(Thread.java:856)
10-10 19:49:19.976: E/AndroidRuntime(4893): Caused by: java.lang.NullPointerException
10-10 19:49:19.976: E/AndroidRuntime(4893): at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.doInBackground(MainActivity.java:140)
10-10 19:49:19.976: E/AndroidRuntime(4893): at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.doInBackground(MainActivity.java:1)
10-10 19:49:19.976: E/AndroidRuntime(4893): at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-10 19:49:19.976: E/AndroidRuntime(4893): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-10 19:49:19.976: E/AndroidRuntime(4893): ... 5 more
Выделил красным ключевые моменты
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

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

Сообщение Remie » 11 окт 2013, 13:44

KamiSempai писал(а):Все предельно ясно, NullPointerException в 140 строке.
Вероятно, здесь действительно все ясно, но я всю голову сломала - выбросила из кода все наработки в попытке выяснить источник NullPointerException. Все что стало ясно, это то, что дело не в результате работы AsyncTask, потому что без привязки Активити все работает без исключений. Укажите, пожалуйста, откуда оно берется? Я даже включала обработку NullPointerException для shouldOverrideUrlLoading, но в этом случае приложение хотя и не падает, окончание обработки перехода по ссылке не выполняет.

Вот упрощенный, вычищенный код, и ошибка.

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

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

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

		String url = "http..";
		webview = (WebView) findViewById(R.id.webview);

		mt = (ParseMyPageTask) getLastNonConfigurationInstance();
		if (mt == null) {
			mt = new ParseMyPageTask();
			mt.execute(url);
		}
		mt.link(this);
		  if(mt.getStatus() == AsyncTask.Status.FINISHED)
			try {
				mt.onPostExecute(mt.get());
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (ExecutionException e) {
				e.printStackTrace();
			} 
		webview.setWebViewClient(new WebViewClient() {
			// @Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				mt = new ParseMyPageTask();
				mt.execute(url);
				return true;
			}
		});
	}

	public Object onRetainNonConfigurationInstance() {
		mt.unLink();
		return mt;
	}

	// ********************** AsyncTask ***************************//
	static 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 result = "";

			try {
				doc = Jsoup.connect(params[0]).data("styleid", "35").get();

				Elements body = doc.select("body");
				result = body.html();

				if (isDebug) {
					Log.v("AsyncTask doInBackground", "Result: " + result);
						}
			} catch (IOException e) {
				e.printStackTrace();
			}
			return result;
		}

		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			activity.webview.loadDataWithBaseURL("http..", result, "text/html", "UTF-8", "");
			return;

				}
			}
}

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

10-11 13:37:15.443: V/AsyncTask doInBackground(9973): Result: 
                                              ЗДЕСЬ МНОГО HTML-кода
10-11 13:37:15.443: D/AndroidRuntime(9973): Shutting down VM
10-11 13:37:15.443: W/dalvikvm(9973): threadid=1: thread exiting with uncaught exception (group=0x411622a0)
10-11 13:37:15.473: E/AndroidRuntime(9973): FATAL EXCEPTION: main
10-11 13:37:15.473: E/AndroidRuntime(9973): java.lang.NullPointerException
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.onPostExecute(MainActivity.java:98)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.onPostExecute(MainActivity.java:1)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at android.os.AsyncTask.finish(AsyncTask.java:631)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at android.os.AsyncTask.access$600(AsyncTask.java:177)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at android.os.Handler.dispatchMessage(Handler.java:99)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at android.os.Looper.loop(Looper.java:137)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at android.app.ActivityThread.main(ActivityThread.java:4921)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at java.lang.reflect.Method.invokeNative(Native Method)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at java.lang.reflect.Method.invoke(Method.java:511)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
10-11 13:37:15.473: E/AndroidRuntime(9973): 	at dalvik.system.NativeStart.main(Native Method)
Строка 98 это

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

activity.webview.loadDataWithBaseURL("http..", result, "text/html", "UTF-8", "");
То есть, выходит result содержит null? Но как это может происходить? Ведь даже Result в логе показывает содержимое.

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

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

Сообщение Foenix » 11 окт 2013, 14:40

нажми на вторую, выделенную красным строку два раза мышью
at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.doInBackground(MainActivity.java:140)

, тебя перебросит на код, в котором нулл. Выше по коду посмотри проинициализированы ли у тебя все переменные, если проинициализированы, то значит в этих операторах где-то что-то не находит.

В новом логе адрес другой
at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.onPostExecute(MainActivity.java:98)
R.id.team

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

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

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

Сообщение Remie » 11 окт 2013, 14:56

Foenix писал(а):нажми на вторую, выделенную красным строку два раза мышью
at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.doInBackground(MainActivity.java:140)

, тебя перебросит на код, в котором нулл. Выше по коду посмотри проинициализированы ли у тебя все переменные, если проинициализированы, то значит в этих операторах где-то что-то не находит.

В новом логе адрес другой
at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.onPostExecute(MainActivity.java:98)
Ну, от двойного клика по строке ничего не поменялось - перебрасывает на ту же строку, что написана в логе - 98.
А переменные проинициализированны все, потому что если убрать связку AsyncTask и Activity, то все обрабатывается без единой ошибки.
Вот код, который работает нормально:

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

public class MainActivity extends Activity {
	public static final boolean isDebug = true;
	private static final String TAG = "myLogs";
	WebView webview;

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

		String url = "http..";
		webview = (WebView) findViewById(R.id.webview);
		new ParseMyPageTask().execute(url);
		webview.setWebViewClient(new WebViewClient() {
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				new ParseMyPageTask().execute(url);
				return true;
			}
		});
	}

	// ********************** AsyncTask ***************************//
	public class ParseMyPageTask extends AsyncTask<String, Void, String> {
		@Override
		protected String doInBackground(String... params) {
			Document doc = null;
			String result = "";

			try {
				doc = Jsoup.connect(params[0]).data("styleid", "35").get();

				Elements body = doc.select("body");
				result = body.html();

				if (isDebug) {
					Log.v("AsyncTask doInBackground", "Result: " + result);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			return result;
			}

		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			webview.loadDataWithBaseURL("http..", result, "text/html", "UTF-8", "");
			return;

		}
				}
}
Проблема возникает после применения связи Activity с AsyncTask

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

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

Сообщение KamiSempai » 11 окт 2013, 15:10

При втором вызове асинктаска вы не совершаете привязку к Activity через mt.link(this);
В итоге activity = null. Результат - NullPointerException.

Сейчас ошибка появляется в onPostExecute, а раньше была в doInBackground. Видимо, вы обошли ее с помощью try catch. Однако, нужно понимать, что если в этом месте что-то не так, result будет null. Учтите это при дальнейшей отладке.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

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

Сообщение Remie » 11 окт 2013, 15:29

KamiSempai
Спасибо огромное! Мне почему-то казалось, что линк с активити я проверяла.
Буду возвращать свой код к полноценному виду)

Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

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

Сообщение Zeban » 30 окт 2013, 07:24

Помогите пожалуйста реализовать все тоже самое, что и в уроке только чтобы таймер запускался с кнопки. Суть моей программы: нажимаешь кнопку запустился таймер, таймер должен продолжать работать и после переворота экрана и после блокировки экрана.
Вот код:

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

@SuppressWarnings("deprecation")
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Log.d("qwe", "create MainActivity: " + this.hashCode());

    tv = (TextView) findViewById(R.id.tv);
    btn = (Button) findViewById(R.id.button1);
    btn.setOnClickListener(oclBtn);
    
    mt = (MyTask) getLastNonConfigurationInstance();
    if (mt == null) {
      mt = new MyTask();
    }
    mt.link(this);
    
    Log.d("qwe", "create MyTask: " + mt.hashCode());
  }
  
  OnClickListener oclBtn = new OnClickListener() {
		@Override
		 public void onClick(View v) {
		      mt.execute();
			}};
			

  public Object onRetainNonConfigurationInstance() {
    mt.unLink();
    return mt;
  }
  

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

    @Override
    protected Void doInBackground(String... params) {
      try {
        int i;
        for ( i = 1; i <= 10; i++) {
          TimeUnit.SECONDS.sleep(1);
          publishProgress(i);
          Log.d("qwe", "i = " + i + ", MyTask: " + this.hashCode()
              + ", MainActivity: " + activity.hashCode());
        }
        i = 1;
      } catch (InterruptedException e) {
        e.printStackTrace();
      }

      return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
      super.onProgressUpdate(values);
      activity.tv.setText("i = " + values[0]);
    }
  }
Программа работает и выполняет свои функции в первое нажатие на кнопку. При следующем нажатии выдает ошибку.
Я понимаю, что не замечаю простейшей ошибки из за неопытности. Но не могу её найти.

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

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

Сообщение KamiSempai » 30 окт 2013, 12:55

Дважды запускать один таймер нельзя.
Делайте проверку на то, что таймер не запускался.
[syntax=java]OnClickListener oclBtn = new OnClickListener() {
@Override
public void onClick(View v) {
switch(mt.getStatus()) {
case AsyncTask.Status.PENDING:
mt.execute();
break;
case AsyncTask.Status.RUNNING:
//Таймер уже запущен
break;
case AsyncTask.Status.FINISHED:
//Таймер уже завершил свою работу
break;
};
}};[/syntax]
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить