我很欣赏有关轮换更改的AsyncTask的大量帖子.使用兼容性lib并试图解雇DialogFragmentin 时,我有以下问题onPostExecute.
我有一个片段,它触发AsyncTask显示进度DialogFragment,然后onPostExecute解散对话框然后可能抛出另一个DialogFragment.
如果在显示进度对话框时我把应用程序放到后台我得到了以下片段:
1) onPause
2) onSaveInstanceState
3)onPostExecute我尝试解雇并调用对话框.
我得到一个IllegalStateException因为我正在尝试在活动保存状态时有效地提交事务并且我理解这一点.
在轮换中,我假设(可能不正确)onPostExecute在重新创建活动之前我不会得到.但是,当把应用程序放到后台时,我假设(肯定是错误的)onPostExectute在片段/活动暂停时不会被调用.
我的问题是,我的解决方案是简单地检测onPostExecute到片段/活动暂停并简单地执行我需要做的事情onResume吗?对我来说似乎有些难看.
提前谢谢,彼得.
编辑1
需要支持2.1及以上版本
编辑2
我已经考虑过使用对话框FragmentTransaction:add,FragmentTransaction:commitAllowingStateLoss但这并非没有问题.
android android-lifecycle android-asynctask android-fragments
我有一个ViewPager,一次加载三个页面.如果我从第1页到第2页再扫描到第3页,则第一页(片段)转到 onPause().然后,如果我滑动到第二页,onResume()即使页面1仍然对用户不可见,第一页也会出现.所以,我的问题是:如何区分代码中的第一页和第二页?例如,如果我必须在片段可见时运行一段代码,那么它是如何完成的?
android android-lifecycle android-fragments android-viewpager
我有一个FragmentActivity支持v4类,它实现了两个并排(类似gmail)片段和一个可以调出DialogFragment的按钮.
除非我有方向改变,否则这一切都很有效.当我有方向更改时,不会保存片段的状态.
主要问题是如果我打开了FragmentDialog,它就会消失.
我已经设置setRetainInstance(true);了所有碎片,但它没有帮助.
在我的清单中,我包括android:configChanges="orientation"但仍然没有帮助.
以下是我的代码示例,感谢您的帮助.
public class AddMasterDialog extends DialogFragment {
private int mTitle;
private int mPrompt;
private OnClickListener onSaveListener;
private OnClickListener onCancelListener;
public AddMasterDialog newInstance(int title, int prompt) {
AddMasterDialog simpleDialog = new AddMasterDialog(title, prompt);
return simpleDialog;
}
public AddMasterDialog() {
// Empty constructor required for DialogFragment
}
public AddMasterDialog(int title, int prompt) {
// Empty constructor required for DialogFragment
mTitle = title;
mPrompt = prompt;
}
public void setSaveButton(OnClickListener save){
onSaveListener = save; …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-fragments android-dialogfragment
Google 在 Android 上弃用 fragment 的 onActivityCreated() 并推荐使用 LifeCycleObserver:
To get a callback specifically when a Fragment activity's
* {@link Activity#onCreate(Bundle)} is called, register a
* {@link androidx.lifecycle.LifecycleObserver} on the Activity's
* {@link Lifecycle} in {@link #onAttach(Context)}, removing it when it receives the
* {@link Lifecycle.State#CREATED} callback.
Run Code Online (Sandbox Code Playgroud)
所以我尝试以推荐的方式制作它,但我只能在 Logcat 中观察到的状态只是State: INITIALIZED。
private lateinit var lifecycleObserver: LifecycleObserver
override fun onAttach(context: Context) {
super.onAttach(context)
hostActivity = context as HostActivity
lifecycleObserver = object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate() {
Logger.tag("SOME-TAG")d("State: …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-fragments android-activity
我想通过调用从另一个Activity(FIRST Activity)开始一个Activity(SECOND Activity)startActivity(intent).在我真正做到之前,我发现有人说生命周期方法按以下顺序调用:
FIRST Activity onCreate
FIRST Activity onStart
FIRST Activity onResume
FIRST Activity onPause
SECOND Activity onCreate
SECOND Activity onStart
SECOND Activity onResume
FIRST Activity onStop
Run Code Online (Sandbox Code Playgroud)
在SECOND Activity onResume之前总是叫FIRST Acitivity onStop?我想
FIRST Activity onPause
FIRST Activity onStop
SECOND Activity onCreate
SECOND Activity onStart
SECOND Activity onResume
Run Code Online (Sandbox Code Playgroud)
将被召唤,但似乎没有.
另外,如果我只是在两个活动之间切换,
FIRST Activity onPause
SECOND Activity onRestart
SECOND Activity onStart
SECOND Activity onResume
FIRST Activity onStop
Run Code Online (Sandbox Code Playgroud)
方法总是按此顺序调用吗?
想象一下这种情况:我有Fragment一个Pager.我尝试切换到其他应用程序,以便Activity拥有我的寻呼机(和我的片段)将最终停止并暂时销毁.
所以,当我回到我的活动,在Fragment的回调onCreate,oncreateview等等被调用.但是Fragment的onDestroy回调都没有被调用过!似乎在"onStop"之后,片段立刻被破坏了.这是正常的行为吗?是不是因为Activity没有召唤它而被摧毁onDestroy?
我收到以下错误,我不知道为什么会发生这种情况.
错误:
08-23 17:07:46.533 22454-22454/com.a.b.c E/AndroidRuntime? FATAL EXCEPTION: main
Process: com.a.b.c, PID: 22454
java.lang.RuntimeException: Unable to resume activity {com.a.b.c/com.a.b.c.MainActivity}: java.lang.IllegalStateException: Activity {com.a.b.c/com.a.b.c.MainActivity} did not call finish() prior to onResume() completing
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: Activity {com.a.b.c/com.a.b.c.MainActivity} did not call finish() prior to onResume() completing
at android.app.Activity.performResume(Activity.java:6324)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102) …Run Code Online (Sandbox Code Playgroud) android runtime-error android-lifecycle android-6.0-marshmallow
我有一个DialogFragment创建一个DatePickerDialog.我正在使用一个静态方法调用newInstance来设置初始值,以便使用默认的空构造函数.但是,我应该如何设置监听器?在屏幕旋转之后,当单击"完成"按钮时,监听器不会执行任何操作,因为它不存在.
public class DatePickerFragment extends DialogFragment {
public static final String ARG_YEAR = "year";
public static final String ARG_MONTH = "month";
public static final String ARG_DAY = "day";
private OnDateSetListener listener_;
public static DatePickerFragment newInstance(OnDateSetListener listener, int year, int month, int day) {
final DatePickerFragment date_picker = new DatePickerFragment();
date_picker.setListener(listener);
final Bundle arguments = new Bundle();
arguments.putInt(ARG_YEAR, year);
arguments.putInt(ARG_MONTH, month);
arguments.putInt(ARG_DAY, day);
date_picker.setArguments(arguments);
return date_picker;
}
private void setListener(OnDateSetListener listener) {
listener_ = listener;
}
@Override
public Dialog …Run Code Online (Sandbox Code Playgroud) 我正在android studio 3.0中使用android插件'com.android.tools.build:gradle:3.0.0-alpha1'和gradle版本构建一个项目gradle-4.0-milestone-1-all.zip.
二手maven repo:
maven {
url 'https://maven.google.com'
}
Run Code Online (Sandbox Code Playgroud)
此外,在我的项目中使用android Room持久性和生命周期.已经在我的app gradle文件中声明了以下依赖项:
compile "android.arch.lifecycle:extensions:1.0.0-alpha1"
compile "android.arch.persistence.room:runtime:1.0.0-alpha1"
annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1"
Run Code Online (Sandbox Code Playgroud)
同步并构建项目时,它显示以下错误:
Failed to resolve: android.arch.lifecycle:extensions:1.0.0-alpha1
我是否遗漏了这个问题或某些其他解决方案.
android android-lifecycle android-studio-3.0 android-architecture-components
ViewModels是独立于活动/片段生命周期还是仅与其配置更改无关.什么时候它们将不复存在并且后续的onCleared()方法被调用.viewModel可以与另一个Activity共享吗?
情况:
Activity1+viewModel1--->(rotation)--->Activity1+viewModel1
--->(launch Intent)--->Activity2+viewModel1
Run Code Online (Sandbox Code Playgroud)
这种分享是否可能,这是一种很好的做法.
此外,由于应用程序生命周期回调,onPause-> onStop-> onDestroy对于两者都是相同的
1.活动旋转和
2.活动结束时,
ViewModel如何在内部确定调用onCleared并最终结束其生命周期的正确时间.
调查结果:
ViewModel在内部使用holderFragment来保存活动的实例,并使用setRetainInstance方法(如片段)来考虑配置更改.
android android-lifecycle android-activity android-viewmodel