ProgressDialog

Ответить
bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

ProgressDialog

Сообщение bundos » 18 май 2013, 12:14

Привет! Метод ProgressDialog.show(Context context,String,String,Boolean) принимает на вход первым праметр Context. Собственно, хотелось бы узнать смысл передачи туда именно Context-a, а не непосредственно Activity. Во всех примерах кода, что нагуглил туда передается Activity.this. Можно пример, где явно передается контекст? Спасибо!

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

Re: ProgressDialog

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

bundos писал(а):Привет! Метод ProgressDialog.show(Context context,String,String,Boolean) принимает на вход первым праметр Context. Собственно, хотелось бы узнать смысл передачи туда именно Context-a, а не непосредственно Activity. Во всех примерах кода, что нагуглил туда передается Activity.this. Можно пример, где явно передается контекст? Спасибо!
Activity.this и есть контекст активити
R.id.team
Политика на форуме запрещена

bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

Re: ProgressDialog

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

Не понял. В гугле написано, что контекст содержит инфу о всем приложении вообще. Т.е. я могу передавать туда экземпляры любого класса, которые отнаследованы от контекста и, в частности, Activity? А какую конкретно инфу из контекста метод show использует для создания ProgressDialog?

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

Re: ProgressDialog

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

Т.е. я могу передавать туда экземпляры любого класса, которые отнаследованы от контекста и, в частности, Activity?
Естественно! См. "наследование".

Если копаете так глубоко, то стоит смотреть исходники, благо они открыты. Метод show создает объект ProgressDialog, который в свою очередь вызывает метод Super у суперкласса, ака AlertDialog, который в свою очередь вызывает super у суперкласса Dialog. Вот тут можно глянуть метод Dialog(Context, int), в котором можно посмотреть для чего нужен контекст.

Вдогонку. Как минимум контест всегда бывает нужен при создании какого-то объекта - View для того, что бы узнать путь к проекту.

bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

Re: ProgressDialog

Сообщение bundos » 18 май 2013, 18:57

Не получается. Создаю новый класс MyContext, наследуюсь от контекста (это для того чтобы передать на вход методу show экземпляр MyContext-a), он надобавлял кучу неведомых методов. Далее класс, который асинхронно подгружает картинку:
[syntax=java]public class ImageDownload extends AsyncTask <Void,Void,Drawable>{

ProgressDialog progressDialog;
Drawable drw;
String url="pict_url";
String url;
MyContext context;
protected void onPreExecute(){
super.onPreExecute();
context =new MyContext();
progressDialog=ProgressDialog.show(context, "message1", "message2");
}

@Override
protected Drawable doInBackground(Void... params) {
try {
drw= Drawable.createFromStream((InputStream) new URL(url).getContent(), "srcName");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return drw;
}

protected void onPostExecute(){
super.onPostExecute(drw);
progressDialog.dismiss();
}[/syntax]
При запуске падает, лог:
05-18 16:42:13.514: E/AndroidRuntime(388): FATAL EXCEPTION: main
05-18 16:42:13.514: E/AndroidRuntime(388): java.lang.AssertionError: LayoutInflater not found.
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.LayoutInflater.from(LayoutInflater.java:174)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.ContextThemeWrapper.getSystemService(ContextThemeWrapper.java:69)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.LayoutInflater.from(LayoutInflater.java:171)
05-18 16:42:13.514: E/AndroidRuntime(388): at com.android.internal.policy.impl.PhoneWindow.<init>(PhoneWindow.java:161)
05-18 16:42:13.514: E/AndroidRuntime(388): at com.android.internal.policy.impl.Policy.makeNewWindow(Policy.java:59)
05-18 16:42:13.514: E/AndroidRuntime(388): at com.android.internal.policy.impl.Policy.makeNewWindow(Policy.java:33)
05-18 16:42:13.514: E/AndroidRuntime(388): at com.android.internal.policy.PolicyManager.makeNewWindow(PolicyManager.java:58)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.app.Dialog.<init>(Dialog.java:142)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.app.AlertDialog.<init>(AlertDialog.java:63)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.app.ProgressDialog.<init>(ProgressDialog.java:80)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.app.ProgressDialog.<init>(ProgressDialog.java:76)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.app.ProgressDialog.show(ProgressDialog.java:101)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.app.ProgressDialog.show(ProgressDialog.java:90)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.app.ProgressDialog.show(ProgressDialog.java:85)
05-18 16:42:13.514: E/AndroidRuntime(388): at com.example.test.ImageDownload.onPreExecute(ImageDownload.java:28)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.os.AsyncTask.execute(AsyncTask.java:391)
05-18 16:42:13.514: E/AndroidRuntime(388): at com.example.test.CurrentFragment.onCreateView(CurrentFragment.java:31)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.support.v4.view.ViewPager.populate(ViewPager.java:1011)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.support.v4.view.ViewPager.populate(ViewPager.java:880)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1374)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.View.measure(View.java:8171)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:578)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:362)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.View.measure(View.java:8171)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.View.measure(View.java:8171)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.widget.LinearLayout.measureVertical(LinearLayout.java:526)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.View.measure(View.java:8171)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.View.measure(View.java:8171)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.os.Handler.dispatchMessage(Handler.java:99)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.os.Looper.loop(Looper.java:123)
05-18 16:42:13.514: E/AndroidRuntime(388): at android.app.ActivityThread.main(ActivityThread.java:4627)
05-18 16:42:13.514: E/AndroidRuntime(388): at java.lang.reflect.Method.invokeNative(Native Method)
05-18 16:42:13.514: E/AndroidRuntime(388): at java.lang.reflect.Method.invoke(Method.java:521)
05-18 16:42:13.514: E/AndroidRuntime(388): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-18 16:42:13.514: E/AndroidRuntime(388): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-18 16:42:13.514: E/AndroidRuntime(388): at dalvik.system.NativeStart.main(Native Method)

Почему нельзя таким образом передать контекст? Как я понял, при создании если у нас есть какой-то класс- потомок контекста, то экземпляр этого класса будет содержать некую инфу обо всем приложении и, соответсвенно, его можно скормить методу show.

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

Re: ProgressDialog

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

Судя по ошибке java.lang.AssertionError, она является чем-то логическим (см. Assert в Java), где не найдено какого-то свойства (LayoutInflater not found.) в контексте. Я так понимаю контекст нельзя создать потому, что, он должен наполниться какой-то системной информацией о приложении. А в твоём случае ты просто создал наследника контекста без информации и естественно not found. Другими словами, откуда в твоем контексте взяться необходимой информации? Думаю контекст так создавать нельзя.

bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

Re: ProgressDialog

Сообщение bundos » 18 май 2013, 22:19

Понятно, спасибо! Переделал и опять не работает :x
[syntax=java] protected void onPreExecute(){
super.onPreExecute();
Bundle bundle= new Bundle();
act= new MainActivity();
act.onCreate(bundle);
progressDialog=new ProgressDialog(act);
progressDialog.setMessage("Downloading pickture from url");
progressDialog.show();
}[/syntax]
Нагуглил, что контекст не доступен из коструктора активити, поэтому вызываю метод onCreate. Но теперь вылетает NullPointerException.

05-18 20:06:27.114: E/AndroidRuntime(531): FATAL EXCEPTION: main
05-18 20:06:27.114: E/AndroidRuntime(531): java.lang.NullPointerException
05-18 20:06:27.114: E/AndroidRuntime(531): at android.app.Activity.getLayoutInflater(Activity.java:2759)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:195)
05-18 20:06:27.114: E/AndroidRuntime(531): at com.example.test.MainActivity.onCreate(MainActivity.java:22)
05-18 20:06:27.114: E/AndroidRuntime(531): at com.example.test.ImageDownload.onPreExecute(ImageDownload.java:30)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.os.AsyncTask.execute(AsyncTask.java:391)
05-18 20:06:27.114: E/AndroidRuntime(531): at com.example.test.CurrentFragment.onCreateView(CurrentFragment.java:31)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.support.v4.view.ViewPager.populate(ViewPager.java:1011)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.support.v4.view.ViewPager.populate(ViewPager.java:880)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1374)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.view.View.measure(View.java:8171)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:578)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:362)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.view.View.measure(View.java:8171)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.view.View.measure(View.java:8171)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.widget.LinearLayout.measureVertical(LinearLayout.java:526)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.view.View.measure(View.java:8171)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.view.View.measure(View.java:8171)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.os.Handler.dispatchMessage(Handler.java:99)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.os.Looper.loop(Looper.java:123)
05-18 20:06:27.114: E/AndroidRuntime(531): at android.app.ActivityThread.main(ActivityThread.java:4627)
05-18 20:06:27.114: E/AndroidRuntime(531): at java.lang.reflect.Method.invokeNative(Native Method)
05-18 20:06:27.114: E/AndroidRuntime(531): at java.lang.reflect.Method.invoke(Method.java:521)
05-18 20:06:27.114: E/AndroidRuntime(531): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-18 20:06:27.114: E/AndroidRuntime(531): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-18 20:06:27.114: E/AndroidRuntime(531): at dalvik.system.NativeStart.main(Native Method)

Оформлять ImageDownload как вложенный подкласс, наверное, смысла не особо имеет. Потому что загруженную картинку в классе ImageDownload я запихиваю во вьюшку во фрагменте Current_Fragment.

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

Re: ProgressDialog

Сообщение Foenix » 19 май 2013, 00:02

onCreate() - это событие, его вообще лучше не вызывать.
R.id.team

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

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

Re: ProgressDialog

Сообщение rezak90 » 19 май 2013, 05:19

bundos
Какое наследование контекста? Какое программное создание активити? Какой ещё вызов onCreate на ходу?
Стирайте и забудьте то что вы написали, потому что это бред. Контекст получается просто из активити ссылкой на неё или на контекст приложение, или ссылкой на активити из фрагмента.
R.id.team
Политика на форуме запрещена

bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

Re: ProgressDialog

Сообщение bundos » 19 май 2013, 11:47

rezak90 писал(а): Какое наследование контекста?
Да, тут я понял почему был не прав. В этом случае создается класс, который никакой инфы о приложении не содержит.
rezak90 писал(а): Какое программное создание активити? Какой ещё вызов onCreate на ходу?
Нужно было получить контекст. Я создал активити программно, вызвал onCreate, потому что в при вызове контркутора активити никакого контекста еще нет. Не вижу ничего криминального, можете пояснить почему так делать нельзя?

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

Re: ProgressDialog

Сообщение Foenix » 19 май 2013, 12:11

Потому, что это не метод, а событие. Вызывая события вы берете на себя функцию второго Бога в операционной системе, а он должен быть один ;)
R.id.team

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

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

Re: ProgressDialog

Сообщение rezak90 » 19 май 2013, 13:08

что бы получить контекст:
getApplicationContext()
this (если активити)
MainActivity.this (если inner class/method)
getActivity() (если во фрагменте)
R.id.team
Политика на форуме запрещена

bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

Re: ProgressDialog

Сообщение bundos » 19 май 2013, 20:29

Foenix писал(а):Потому, что это не метод, а событие. Вызывая события вы берете на себя функцию второго Бога в операционной системе, а он должен быть один ;)
Вот оно где подвох, спасибо!

Arslaman
Сообщения: 4
Зарегистрирован: 31 май 2013, 15:23

Re: ProgressDialog

Сообщение Arslaman » 31 май 2013, 15:31

Рассматриваю несколько open-source проектов на андроид и везде там получение контекста сделано через передачу в параметрах. В том числе много статических классов, работающих с SqlLite и в каждом методе необходима передача контекста.
В свое время когда гуглил тему получения контекста, то натолкнулся на решение аналогичное этому:
http://stackoverflow.com/questions/2002 ... 61#5114361
Там контекст берется из Application.
Какой из способов предпочтительнее (передача в параметрах или из Apllication)? Может есть подводные камни в получении контекста из Application?

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

Re: ProgressDialog

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

Да. На сколько знаю, контекст от Application не даст показать ProgressDialog. Туда вроде надо передавать контекст именно той активности, в которой он будет просматриваться. Вроде так.

Arslaman
Сообщения: 4
Зарегистрирован: 31 май 2013, 15:23

Re: ProgressDialog

Сообщение Arslaman » 31 май 2013, 15:58

http://android-developers.blogspot.co.i ... leaks.html в этой статье идет речь об утечке памяти связанной с контекстом Activity. Если я правильно понял, то разбирается случай, когда долгоживущий объект связан с контекстом активити и из-за этого GC не может удалить из памяти данное активити. Как одно из решений данной проблемы, в статье призывается использовать в данном случае контекст именно Application - так не будет связи с активити, которые должны иметь возможность умирать.

no--, как вы получаете контекст в своих приложениях?

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

Re: ProgressDialog

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

Да, помню что там есть факт утечки и что советуют использовать контекст от Application и this. Именно так и использую.

Arslaman
Сообщения: 4
Зарегистрирован: 31 май 2013, 15:23

Re: ProgressDialog

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

Спасибо вам, вопрос исчерпан :)

Arslaman
Сообщения: 4
Зарегистрирован: 31 май 2013, 15:23

Re: ProgressDialog

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

Созрел еще вопрос. Для дальнейшего написания тестов контекст все таки лучше передавать в параметрах? Кто имел опыт написания тестов?

Ответить