Страница 1 из 1

ProgressDialog

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

Re: ProgressDialog

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

Re: ProgressDialog

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

Re: ProgressDialog

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

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

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

Re: ProgressDialog

Добавлено: 18 май 2013, 18:57
bundos
Не получается. Создаю новый класс 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.

Re: ProgressDialog

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

Re: ProgressDialog

Добавлено: 18 май 2013, 22:19
bundos
Понятно, спасибо! Переделал и опять не работает :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.

Re: ProgressDialog

Добавлено: 19 май 2013, 00:02
Foenix
onCreate() - это событие, его вообще лучше не вызывать.

Re: ProgressDialog

Добавлено: 19 май 2013, 05:19
rezak90
bundos
Какое наследование контекста? Какое программное создание активити? Какой ещё вызов onCreate на ходу?
Стирайте и забудьте то что вы написали, потому что это бред. Контекст получается просто из активити ссылкой на неё или на контекст приложение, или ссылкой на активити из фрагмента.

Re: ProgressDialog

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

Re: ProgressDialog

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

Re: ProgressDialog

Добавлено: 19 май 2013, 13:08
rezak90
что бы получить контекст:
getApplicationContext()
this (если активити)
MainActivity.this (если inner class/method)
getActivity() (если во фрагменте)

Re: ProgressDialog

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

Re: ProgressDialog

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

Re: ProgressDialog

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

Re: ProgressDialog

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

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

Re: ProgressDialog

Добавлено: 31 май 2013, 16:07
Mikhail_dev
Да, помню что там есть факт утечки и что советуют использовать контекст от Application и this. Именно так и использую.

Re: ProgressDialog

Добавлено: 31 май 2013, 16:14
Arslaman
Спасибо вам, вопрос исчерпан :)

Re: ProgressDialog

Добавлено: 31 май 2013, 17:42
Arslaman
Созрел еще вопрос. Для дальнейшего написания тестов контекст все таки лучше передавать в параметрах? Кто имел опыт написания тестов?