Урок 91. AsyncTask. Поворот экрана
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 91. AsyncTask. Поворот экрана
Почитайте основы Java, по книге: Хорстманн том 1 Основы. Андроид учить с Java параллельно будет утомительно трудно. Считайте, что андроид - это надстройка над языком. Вы не сможете нормально учить эту надстройку, когда надо знать то, что снизу, под ней.
Re: Урок 91. AsyncTask. Поворот экрана
Копирую код с урока, в MyTask добавляю метод
И приложение начинает вылетать при запуске. Второй день мучаюсь, подскажите, в чем может быть причина?
В LogCat'е вот что пишет...
Код: Выделить всё
@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
Re: Урок 91. AsyncTask. Поворот экрана
вот ответ:shtil писал(а):И приложение начинает вылетать при запуске. Второй день мучаюсь, подскажите, в чем может быть причина?
shtil писал(а):Копирую код с урока
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 91. AsyncTask. Поворот экрана
Что то не вкурил ответ... Конкретнее можно?rezak90 писал(а):вот ответ:shtil писал(а):И приложение начинает вылетать при запуске. Второй день мучаюсь, подскажите, в чем может быть причина?shtil писал(а):Копирую код с урока
Re: Урок 91. AsyncTask. Поворот экрана
Я хотел сделать акцент на то что нужно понимать то что копируешь, куда и зачем. NullPointerException говорит о том что объект не проинициализирован, а ты к нему обращаешься.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 91. AsyncTask. Поворот экрана
Да, я это понял.. Не мог понять на какой именно объект матерится. Оказывается, я не передал ссылку на текущее Activity. Теперь полностью разобрался.rezak90 писал(а):Я хотел сделать акцент на то что нужно понимать то что копируешь, куда и зачем. NullPointerException говорит о том что объект не проинициализирован, а ты к нему обращаешься.
Спасибо за пинок, помогло)
Re: Урок 91. AsyncTask. Поворот экрана
unLink не нужен, только ошибку может выдать, если переменная класса AsyncTask не была определена до поворота экрана!
Re: Урок 91. AsyncTask. Поворот экрана
Нужна помощь.
Применила урок к своему учебному проекту, но при повороте данные в активити не отображаются.
Все ведь, вроде бы, верно?
Применила урок к своему учебному проекту, но при повороте данные в активити не отображаются.
Код: Выделить всё
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;
}
}
}
Re: Урок 91. AsyncTask. Поворот экрана
Вот примерный лог
Код: Выделить всё
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
Re: Урок 91. AsyncTask. Поворот экрана
Ммм.. никто не видит, в чем может быть причина ошибки или в эту тему никто не заглядывает?
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 91. AsyncTask. Поворот экрана
Скорее всего в момент поворота экрана 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.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 91. AsyncTask. Поворот экрана
KamiSempai, спасибо! помогло)
Но обнаружилась еще одна проблема - при переходе по ссылке в webview вылазит
в onCreate пишу так:
Не пойму, что ему не нравится, я ведь создаю Новую задачу. Прошлая уже не должна оставаться в памяти..
Но обнаружилась еще одна проблема - при переходе по ссылке в 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
Код: Выделить всё
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. Поворот экрана
Все предельно ясно, 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.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 91. AsyncTask. Поворот экрана
Вероятно, здесь действительно все ясно, но я всю голову сломала - выбросила из кода все наработки в попытке выяснить источник NullPointerException. Все что стало ясно, это то, что дело не в результате работы AsyncTask, потому что без привязки Активити все работает без исключений. Укажите, пожалуйста, откуда оно берется? Я даже включала обработку NullPointerException для shouldOverrideUrlLoading, но в этом случае приложение хотя и не падает, окончание обработки перехода по ссылке не выполняет.KamiSempai писал(а):Все предельно ясно, NullPointerException в 140 строке.
Вот упрощенный, вычищенный код, и ошибка.
Код: Выделить всё
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)
Код: Выделить всё
activity.webview.loadDataWithBaseURL("http..", result, "text/html", "UTF-8", "");
Re: Урок 91. AsyncTask. Поворот экрана
нажми на вторую, выделенную красным строку два раза мышью
at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.doInBackground(MainActivity.java:140)
, тебя перебросит на код, в котором нулл. Выше по коду посмотри проинициализированы ли у тебя все переменные, если проинициализированы, то значит в этих операторах где-то что-то не находит.
В новом логе адрес другой
at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.onPostExecute(MainActivity.java:98)
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
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 91. AsyncTask. Поворот экрана
Ну, от двойного клика по строке ничего не поменялось - перебрасывает на ту же строку, что написана в логе - 98.Foenix писал(а):нажми на вторую, выделенную красным строку два раза мышью
at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.doInBackground(MainActivity.java:140)
, тебя перебросит на код, в котором нулл. Выше по коду посмотри проинициализированы ли у тебя все переменные, если проинициализированы, то значит в этих операторах где-то что-то не находит.
В новом логе адрес другой
at com.gmail.remielk.gamecli.MainActivity$ParseMyPageTask.onPostExecute(MainActivity.java: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;
}
}
}
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 91. AsyncTask. Поворот экрана
При втором вызове асинктаска вы не совершаете привязку к Activity через mt.link(this);
В итоге activity = null. Результат - NullPointerException.
Сейчас ошибка появляется в onPostExecute, а раньше была в doInBackground. Видимо, вы обошли ее с помощью try catch. Однако, нужно понимать, что если в этом месте что-то не так, result будет null. Учтите это при дальнейшей отладке.
В итоге activity = null. Результат - NullPointerException.
Сейчас ошибка появляется в onPostExecute, а раньше была в doInBackground. Видимо, вы обошли ее с помощью try catch. Однако, нужно понимать, что если в этом месте что-то не так, result будет null. Учтите это при дальнейшей отладке.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 91. AsyncTask. Поворот экрана
KamiSempai
Спасибо огромное! Мне почему-то казалось, что линк с активити я проверяла.
Буду возвращать свой код к полноценному виду)
Спасибо огромное! Мне почему-то казалось, что линк с активити я проверяла.
Буду возвращать свой код к полноценному виду)
Re: Урок 91. AsyncTask. Поворот экрана
Помогите пожалуйста реализовать все тоже самое, что и в уроке только чтобы таймер запускался с кнопки. Суть моей программы: нажимаешь кнопку запустился таймер, таймер должен продолжать работать и после переворота экрана и после блокировки экрана.
Вот код:
Программа работает и выполняет свои функции в первое нажатие на кнопку. При следующем нажатии выдает ошибку.
Я понимаю, что не замечаю простейшей ошибки из за неопытности. Но не могу её найти.
Вот код:
Код: Выделить всё
@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. Поворот экрана
Дважды запускать один таймер нельзя.
Делайте проверку на то, что таймер не запускался.
[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]
Делайте проверку на то, что таймер не запускался.
[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.
Хватит таскать макулатуру на тренировку! Используй T Note.