在我的Android应用程序中,当我旋转设备(滑出键盘)然后我Activity重新启动(onCreate被调用).现在,这可能是它应该如何,但我在onCreate方法中做了很多初始设置,所以我需要:
onCreate不会再次调用,布局只是调整或onCreate不调用.这个错误是什么,为什么会发生?
05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.ViewRoot.<init>(ViewRoot.java:231)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.Window$LocalWindowManager.addView(Window.java:424)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Dialog.show(Dialog.java:239)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP$PreparePairingLinkageData.onPreExecute(viewP.java:183)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.AsyncTask.execute(AsyncTask.java:391)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP.onCreate(viewP.java:94)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544) …Run Code Online (Sandbox Code Playgroud) 我正在使用智能手机/平板电脑应用程序,只使用一个APK,并根据屏幕大小根据需要加载资源,最佳设计选择似乎是通过ACL使用Fragments.
这个应用程序一直工作正常,直到现在只是基于活动.这是一个模拟类,用于处理活动中的AsyncTasks和ProgressDialogs,以便在屏幕旋转或通信中发生配置更改时使它们工作.
我不会改变清单以避免重新创建活动,有很多原因我不想这样做,但主要是因为官方文档说它不是推荐的,而且我已经管理了这么远,所以请不要推荐路线.
public class Login extends Activity {
static ProgressDialog pd;
AsyncTask<String, Void, Boolean> asyncLoginThread;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.login);
//SETUP UI OBJECTS
restoreAsyncTask();
}
@Override
public Object onRetainNonConfigurationInstance() {
if (pd != null) pd.dismiss();
if (asyncLoginThread != null) return (asyncLoginThread);
return super.onRetainNonConfigurationInstance();
}
private void restoreAsyncTask();() {
pd = new ProgressDialog(Login.this);
if (getLastNonConfigurationInstance() != null) {
asyncLoginThread = (AsyncTask<String, Void, Boolean>) getLastNonConfigurationInstance();
if (asyncLoginThread != null) {
if (!(asyncLoginThread.getStatus()
.equals(AsyncTask.Status.FINISHED))) {
showProgressDialog();
}
}
} …Run Code Online (Sandbox Code Playgroud) android progressdialog android-asynctask android-fragments android-support-library
如何在用户更改方向时,如何避免在活动中使用asynctask类重新加载活动?谁能举个例子?
我从客户端远程获取以下内容,因此我不知道他们正在使用什么硬件等.
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:200)
at android.view.Window$LocalWindowManager.removeView(Window.java:417)
at android.app.Dialog.dismissDialog(Dialog.java:279)
at android.app.Dialog.access$000(Dialog.java:72)
at android.app.Dialog$1.run(Dialog.java:108)
at android.app.Dialog.dismiss(Dialog.java:263)
at com..mysite.android.ActivityGame$1.onFinish(ActivityGame.java:154)
at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:118)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4203)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
Run Code Online (Sandbox Code Playgroud)
这是因为ProgressDialog而发生的
progressDialog = new ProgressDialog( this );
progressDialog.setMessage(getString(R.string.get_ready));
progressDialog.setCancelable(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMax(12);
progressDialog.show();
new CountDownTimer(3000, 250) {
@Override
public void onTick(long millisUntilFinished) {
//progressDialog.incrementProgressBy(1);
}
@Override
public void onFinish() {
progressDialog.dismiss(); //********* ERROR HAPPENS HERE *********
nextQuestion();
}
}.start();
Run Code Online (Sandbox Code Playgroud)
活动在清单中看起来像这样. …
我有一个注册屏幕,用户输入所有注册详细信息,当用户点击"注册"按钮时,我显示进度条(进度条开始旋转),然后将用户带到主屏幕.如果用户旋转当进度条旋转时,进度条被取消.我希望方向不会从potrait变为横向,反之亦然,当进度条可见时(意味着它正在旋转).进度条如何停止方向改变旋转?任何帮助将不胜感激.
使用案例:
用户启动将加载验证码的应用程序.用户填写验证码并尝试下载一些信息.
问题:
如果用户在下载时旋转设备Activity则被销毁.在执行结束时,AsyncTask正在尝试更新被破坏的内容Activity,结果是"View not attached to window manager".
"错误的"解决方案:
我可以用a掩盖问题,android:configChanges="orientation|keyboardHidden|screenSize"但是这样布局不会更新为横向.
我在问什么:
是否可以更改方向并更改传递给上下文的"参考" AsyncTask?
这个答案建议检查对话框是否为空,但它不是我正在寻找的.
在这里,他建议使用WeakReference(这里有一个关于如何使用它的好片段),但我不明白它是否是我正在寻找的.
更明确一点,这就是我在onPostExecute中所做的:
@Override
protected void onPostExecute(Auto result) {
progress.dismiss();
new DownloaderCaptcha(context).execute("");
((EditText)context.findViewById(R.id.editTextCaptcha)).setText("");
context.findViewById(R.id.progrBar).setVisibility(View.VISIBLE);
context.findViewById(R.id.captcha).setVisibility(View.INVISIBLE);
if(result != null) {
Storage.storeHistory(context, result.getTarga().getValue());
Intent i = new Intent(context, MenuActivity.class);
i.putExtra("result", result);
context.startActivity(i);
} else {
ErrorDialog.show(context, error);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一块想要在屏幕上加载的图像.所有图像都是我下载并存储在SD-CARD上的文件.
到目前为止,我发现了两种方法,首先是在活动开始时将它们加载到主线程上(我得到了大约70个图像,所有加载它们需要大约2.1秒).
另一种方式是我现在正在测试的.将它们加载到分离的线程上,同时我可以为用户显示加载动画.现在我使用ThreadPoolExecutor实现了4.3秒.我在10个线程上做到了.
最后一种方法,(这是我唯一没有测试的方法)是使用精灵表.
我不能使用应用程序缓存,因为在我的应用程序中我有很多屏幕,每个屏幕都有自己的图像集.
您怎么看?加载大量图像的最快方法是什么?您知道哪些加速技术可以帮助我?
我正在构建一个使用相机预览的相机应用程序.为了使用全屏进行预览,我锁定了活动
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Run Code Online (Sandbox Code Playgroud)
现在我遇到了以下问题:每当我渲染一个表单或者我必须显示一个对话框时,它总是以横向模式显示,即使用户在纵向模式下使用他/她的设备也是如此.我试图通过使用变换动画来旋转edittext视图,并且它们被正确旋转,但我仍然无法再将它们聚焦,并且键盘也始终显示在横向中:(
你知道在这里寻找方法吗?
重要提示:检测方向不是问题所在.问题是:如何以仍然可用的方式旋转表单/视图/视图组和键盘.
我知道它必须以某种方式成为可能:三星的相机应用程序(它与星系S3一起提供)能够在不旋转预览的情况下旋转视图,因此它必须是可能的!看到:
http://www.letsgomobile.org/images/reviews/0186/galaxy-s3-camera.jpg