Урок 12. Логи и всплывающие сообщения

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Digetix » 06 май 2013, 22:57

Помогите, пожалуйста, разобраться с логами
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:3724)
at android.view.View.performClick(View.java:4261)
at android.view.View$PerformClick.run(View.java:17356)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at android.view.View$1.onClick(View.java:3719)
... 11 more
Caused by: java.lang.NullPointerException
at com.ex.MainActivity.ParseQueryMap(MainActivity.java:397)
at com.ex.MainActivity.onClickParse(MainActivity.java:493)
... 14 more
Я так понимаю, что ошибки в строках 397 и 493,
397 это

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

public void ParseQueryMap() {
              ParseQuery query = new ParseQuery("MyObject");
              query.findInBackground(new FindCallback() {
              public void done(List<ParseObject> myObject, ParseException e) {            // это 397-ая строка
              if (e == null) {

                        for ( int i = 0; i < myObject.size(); i++) {
		        
                              commGet =  myObject.get(i).getString("Comment");
                              bugGet = myObject.get(i).getObjectId();	

                              geo1Dub = myObject.get(i).getParseGeoPoint("location").getLatitude();
                              geo2Dub = myObject.get(i).getParseGeoPoint("location").getLongitude();                                                      
                              
                             }
                                 
                 } else {
                        Toast.makeText(MainActivity.this, "Error!", Toast.LENGTH_SHORT).show();
                  }
              }
          });
А 493 это вообще пустая строка :?

Ещё один лог
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ex/com.ex.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
at android.app.ActivityThread.access$1500(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.ex.MainActivity.onCreate(MainActivity.java:96)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
... 11 more
Здесь по-моему ругается на 96 строку, но в коде это
myMap = mySupportMapFragment.getMap();
myMap.setMyLocationEnabled(true); // это 96-ая строка
.
И ещё один лог
java.lang.IllegalArgumentException: value may not be null.
at com.parse.ParseObject.put(ParseObject.java:1889)
at com.ex.ActivityAdd$3$1.onClick(ActivityAdd.java:168)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:197)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
Подскажите, как в этом разобраться. Всем спасибо

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение rezak90 » 06 май 2013, 23:23

Подскажите, как в этом разобраться
Дебажить и смотреть где null
P.S. На нулы объекты всё таки проверять нужно, а то не красиво получается.
R.id.team
Политика на форуме запрещена

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Digetix » 06 май 2013, 23:29

rezak90 писал(а):
Подскажите, как в этом разобраться
Дебажить и смотреть где null
Так в логике программы вроде нигде нулл не должен быть

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Mikhail_dev » 07 май 2013, 00:08

Сейчас сам наткнулся на одну интересную деталь. Поймал ошибку в такой строке.
[syntax=java]if (0 == objectName.compareToIgnoreCase("id")) id = jsonParser.getLongValue();[/syntax]
Угадайте что это? Строка? Ан нет. Это две строки. Но Eclipse считает их за одну. И показывал на строку совершенно другую. Так что настоятельно советую делать вот так
[syntax=java]if (0 == objectName.compareToIgnoreCase("id"))
id = jsonParser.getLongValue();[/syntax]

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение rezak90 » 07 май 2013, 00:27

Так в логике программы вроде нигде нулл не должен быть
:lol: :lol: :lol: ну да, зачем нам проверки, мы всегда уверены что объекты инициализируются
Угадайте что это? Строка? Ан нет. Это две строки.
[syntax=java5]if (0 == objectName.compareToIgnoreCase("id")) id = jsonParser.getLongValue();[/syntax]
вот за такую манеру писать потом ай-ай-яй делают у нас :D
R.id.team
Политика на форуме запрещена

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Mikhail_dev » 07 май 2013, 01:06

Я в основном использую скобки и пишу нормально, но периодически это слишком идиотски выглядит. Я серьёзно. К примеру работав с сокетами в обычной java se, там был метод closeConnection(); Его реализация была из разряда
if (socket!=null) socket.close();
if (sout!=null) sout.close;
if (sIn!=null) sIn.close();
if (..) ..;
В общем 4-5 условий таких шло. Делать через скобки - извращение. Надо понимать, что Code Convention это в основном своём рекомендации.

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Digetix » 07 май 2013, 16:04

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

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Mikhail_dev » 07 май 2013, 16:34

Я могу только догадываться, что там вызвает null. Но, смею предположить вариант решения.
[syntax=java]
public void ParseQueryMap() {
ParseQuery query = new ParseQuery("MyObject");
query.findInBackground(new FindCallback() {
public void done(List<ParseObject> myObject, ParseException e) { // это 397-ая строка
if (e == null) {
if ((myObject==null)||(myObject.size()==0))
return; // выход с метода. А может быть и break; , если надо выход только с цикла сделать
for ( int i = 0; i < myObject.size(); i++) {
if (myObject.get(i)==null) {
continue;
}
commGet = myObject.get(i).getString("Comment");
bugGet = myObject.get(i).getObjectId();

geo1Dub = myObject.get(i).getParseGeoPoint("location").getLatitude();
geo2Dub = myObject.get(i).getParseGeoPoint("location").getLongitude();
}
} else {
Toast.makeText(MainActivity.this, "Error!", Toast.LENGTH_SHORT).show();
}
}
});
[/syntax]

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение rezak90 » 07 май 2013, 16:48

Digetix писал(а):
rezak90 писал(а):ну да, зачем нам проверки, мы всегда уверены что объекты инициализируются
Подскажите, пожалуйста, как проверить на null
[syntax=java5]if(object != null)
{
//code
}
else
{
return;
}[/syntax]
R.id.team
Политика на форуме запрещена

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Napalm » 17 май 2013, 12:01

Прошу подсказать, что указывать вместо this в context, если я Toast вызываю из стороннего потока? Так как если пишу this у меня приложение крушится
05-17 09:01:07.512: E/AndroidRuntime(569): FATAL EXCEPTION: Thread-10

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Mikhail_dev » 17 май 2013, 12:25

getApplicationContext как вариант. Вроде должно помочь. Если не поможет, то передавать контекст активности, что будет выводить данный Toast

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Napalm » 17 май 2013, 12:41

no-- писал(а):Если не поможет, то передавать контекст активности, что будет выводить данный Toast
GetAplicationContext() не помог, не могли бы вы чуть по подробней описать второй вариант?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 12. Логи и всплывающие сообщения

Сообщение klblk » 17 май 2013, 12:52

Napalm писал(а):Прошу подсказать, что указывать вместо this в context, если я Toast вызываю из стороннего потока? Так как если пишу this у меня приложение крушится
05-17 09:01:07.512: E/AndroidRuntime(569): FATAL EXCEPTION: Thread-10
Выстрел в небо, но может быть поможет, что-нибудь типа "MyActivity.this".

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Napalm » 17 май 2013, 13:18

klblk писал(а): Выстрел в небо, но может быть поможет, что-нибудь типа "MyActivity.this".
Жаль не в самую серёдку :)
История та же.
Пишет, не могу, и всё тут:
05-17 10:17:00.160: E/AndroidRuntime(382): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Mikhail_dev » 17 май 2013, 13:40

Суть в том, что контекст надо передавать той активности, которая будет открыта в тот момент, когда будет этот toast всплывать. Так как контекст это суперкласс активности, то просто передавать в тост ту активность, в которой он будет показан.

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Napalm » 17 май 2013, 13:50

no-- писал(а):Суть в том, что контекст надо передавать той активности, которая будет открыта в тот момент, когда будет этот toast всплывать. Так как контекст это суперкласс активности, то просто передавать в тост ту активность, в которой он будет показан.
Звучит действительно просто)) Осталось понять, как это делается. Ладно, в любом случае, благодарю, буду пробовать разбираться.

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Mikhail_dev » 17 май 2013, 14:15

Хорошо, тогда просьба пояснить как это реализуется сейчас. Действия происходят в одной активности или в двух? Или в одной активности вызывается отдельный поток и в нём вызывается Toast?

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Napalm » 17 май 2013, 14:31

Действие происходит в одной активности, в которой вызывается поток.
До вызова потока отображается Toast с соответствующим сообщением.
В потоке происходят определённые действия и по его завершению вызывается Toast с сообщением о результатах выполнения.
Тот Toast, что до потока отображается, который внутри потока крушит всё. Знаю, что нельзя обращаться к элементам интерфейса из отдельного потока, но как реализовать иначе, не знаю.

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 12. Логи и всплывающие сообщения

Сообщение brucemax » 17 май 2013, 14:53

Если проблема заключается в вызове показа тоста из своего потока, то вот решение http://stackoverflow.com/questions/4209 ... m-a-thread
http://stackoverflow.com/questions/3134 ... n-a-thread

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

Re: Урок 12. Логи и всплывающие сообщения

Сообщение Mikhail_dev » 17 май 2013, 15:02

Да, действительно, попробуй
[syntax=java]activity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
}
});[/syntax]
что указали в последнем сообщении, перед моим.
А вообще я бы наверное сделал через AsynckTask. Просто я не пойму что у тебя там делается, поэтому могу гадать только, да и то поверхностно.

Ответить