我的程序在后台线程中执行一些网络活动.在开始之前,它会弹出一个进度对话框.该对话框在处理程序上被关闭.这一切都很好,除非在对话框启动时屏幕方向发生变化(后台线程正在运行).此时,应用程序崩溃或死锁,或进入一个奇怪的阶段,在应用程序完全无法工作之前,直到所有线程都被杀死.
如何优雅地处理屏幕方向变化?
下面的示例代码大致匹配我的真实程序:
public class MyAct extends Activity implements Runnable {
public ProgressDialog mProgress;
// UI has a button that when pressed calls send
public void send() {
mProgress = ProgressDialog.show(this, "Please wait",
"Please wait",
true, true);
Thread thread = new Thread(this);
thread.start();
}
public void run() {
Thread.sleep(10000);
Message msg = new Message();
mHandler.sendMessage(msg);
}
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
mProgress.dismiss();
}
};
}
Run Code Online (Sandbox Code Playgroud)
堆:
E/WindowManager( 244): Activity MyAct has …Run Code Online (Sandbox Code Playgroud) 我正在使用Android应用程序来显示网络错误.
NetErrorPage.java
package exp.app;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class NetErrorPage extends Activity implements OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.neterrorlayout);
Button reload=(Button)findViewById(R.id.btnReload);
reload.setOnClickListener(this);
showInfoMessageDialog("Please check your network connection","Network Alert");
}
public void onClick(View arg0)
{
if(isNetworkAvailable())
{
Intent myIntent = new Intent((Activity)NetErrorPage.this, MainActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
((Activity)NetErrorPage.this).startActivity(myIntent);
finish();
}
else
showInfoMessageDialog("Please check your network connection","Network Alert");
}
public …Run Code Online (Sandbox Code Playgroud) inviteBu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(ChoiceList.size()>0)
{
LayoutInflater factory = LayoutInflater.from(MobileConnectActivity.this);
final View textEntryView = factory.inflate(R.layout.invite_dialog, null);
final EditText et =(EditText) textEntryView.findViewById(R.id.usercontent_edit);
dia= new AlertDialog.Builder(MobileConnectActivity.this)
.setTitle(getString(R.string.invite_input_content))
.setView(textEntryView)
.setPositiveButton(getString(R.string.invite_send), new DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, int whichButton) {
dialog.dismiss();
if(et.getText().toString()==null && et.getText().equals("") )
{
Toast.makeText(getApplicationContext(), getString(R.string.invite_content_check), Toast.LENGTH_SHORT).show();
}
else{
new AsyncTask<Void, Void, String>() {
CustomDialog mProgressBar = new CustomDialog(MobileConnectActivity.this, R.style.dialog);
protected void onPreExecute() {
mProgressBar.show();
};
protected void onCancelled() { …Run Code Online (Sandbox Code Playgroud) 我正在使用Dialog在我的应用程序中创建一些快速视图(如登录输入名称等)
而我正在徘徊更好的东西:隐藏或解雇.
我知道他们两个都做了但是我一直在徘徊,如果最好只是隐藏一个Dialog并在我需要时再次显示它,或者将它解散并重新创建它.
我的对话框很小,在我的代码中是非常静态的,因此我没有大量的实例.
所以有人可以给我使用hide而不是dismiss的优点和缺点.
贾森
看看这些代码:
问题
当我点击"主页按钮"时,exception抛出:Activity泄漏了窗口......从这一行:
localWindowManager.addView(colourView, layoutParams);
Run Code Online (Sandbox Code Playgroud)
问题(S)
你知道是什么原因引起的吗?
当我用后退按钮关闭应用程序时,问题不会发生.
异常/错误日志
W/InputManagerService( 96): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@40908148 (uid=10056 pid=1368)
D/CordovaActivity( 1368): CordovaActivity.onDestroy()
D/CordovaWebView( 1368): >>> loadUrlNow()
E/WindowManager( 1368): Activity com.phonegap.helloworld.HelloWorld has leaked window pl.edu.uj.tcs.student.xxx.Display$Layer@40589368 that was originally added here
E/WindowManager( 1368): android.view.WindowLeaked: Activity com.phonegap.helloworld.HelloWorld has leaked window pl.edu.uj.tcs.student.xxx.Display$Layer@40589368 that was originally added here
E/WindowManager( 1368): at android.view.ViewRoot.<init>(ViewRoot.java:258)
E/WindowManager( 1368): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
E/WindowManager( 1368): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/WindowManager( 1368): at android.view.Window$LocalWindowManager.addView(Window.java:424)
E/WindowManager( 1368): at pl.edu.uj.tcs.student.xxx.Display.setColorsViews(Display.java:181)
E/WindowManager( 1368): …Run Code Online (Sandbox Code Playgroud) 由于使用AlertDialog,我在运行时遇到窗口泄漏错误.
我在下面的代码中指出了错误行:
堆栈跟踪:
08-18 02:48:04.489 28893-28893/? E/WindowManager? Activity com.ms.ha.fragment.FirstActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{52e58540 V.E..... R.....ID 0,0-1026,585} that was originally added here
android.view.WindowLeaked: Activity com.ms.ha.fragment.FirstActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{52e58540 V.E..... R.....ID 0,0-1026,585} that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:239)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
at android.app.Dialog.show(Dialog.java:281)
at com.ms.ha.fragment.TourGuideLoadURLFragment$WebAppInterface.moveToNextScreen(TourGuideLoadURLFragment.java:116)
at android.webkit.WebViewCore.nativeMouseClick(Native Method)
at android.webkit.WebViewCore.nativeMouseClick(Native Method)
at android.webkit.WebViewCore.access$6800(WebViewCore.java:59)
at android.webkit.WebViewCore$EventHub.dispatchWebKitEvent(WebViewCore.java:1793)
at android.webkit.WebViewInputDispatcher.dispatchWebKitEvent(WebViewInputDispatcher.java:689)
at android.webkit.WebViewInputDispatcher.dispatchWebKitEvents(WebViewInputDispatcher.java:639)
at android.webkit.WebViewInputDispatcher.access$800(WebViewInputDispatcher.java:78)
at android.webkit.WebViewInputDispatcher$WebKitHandler.handleMessage(WebViewInputDispatcher.java:1153)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:814)
at java.lang.Thread.run(Thread.java:841)
Run Code Online (Sandbox Code Playgroud)
FirstActivity.java:
public class FirstActivity extends FragmentActivity implements View.OnClickListener{ …Run Code Online (Sandbox Code Playgroud) 我想知道我们是否有可能postDelayed在android上处理/检测带有延迟(方法)的可运行回调?
例如,handler.postDelayed(new Runnable()...我的应用程序(用于测试目的的应用程序)有一个或几个splashscreen(运行).在这个应用程序中,我还有一个库(我正在应用程序中创建和使用它)以及一些在类上运行的IntentService类.
有时,当应用程序运行那些splashscreenActivities(for Testing purpose)时,我正在创建的库可能会在UI中自动弹出一些活动.但似乎如果这些活动出现在splashscreen活动上并且splashscreen正在被销毁,那些活动(自动弹出)也将被销毁并在logcat中记录"泄露的窗口"消息.
问题是:
所以我的问题是(相对于我正在创建的库方面而没有UI应用程序流的信息):
PS:请注意,通常情况下,我正在使用自动出现的假设活动的对话框.
UPDATE
图解说明:
现在我有一个正在执行Splashscreen的案例.
扩展IntentService类的类已收到来自Internet的请求,该请求将启动一个Activity.
同时启动了启动画面postdelayed,其他活动已创建并在UI中显示.当X秒已经过去且另一个Activity未被销毁时,将创建Next Activity并自动销毁另一个Activity.在这样做时,Android会相对于Activity抛出"泄露的窗口"消息.
java android android-activity android-handler android-looper
是的,我已经阅读了关于同样问题的无数问题.
我的代码很简单:我只是用showDialog(int id)的onCreate,然后我旋转设备.代码就是那个(测试用例),这足以导致问题.我的理解是,showDialog方法会处理这个......对话框会消失,然后onCreate在更改后稍后调用,再次干净地显示对话框.但不是.这个推理有什么问题?
我(我想)了解原因,但我不知道如何解决这个问题.即使是iosched应用程序在实现EULA窗口时也存在同样的问题(在eula对话框上更改方向并且您会收到泄漏).我已经阅读了关于关闭onPause的对话框的内容,但是1)我没有显示它的风险,并且2)跟踪对话似乎太多了.必须有一个更强大的方法.
那么......处理这个问题需要哪些更干净的代码呢?
谢谢.
日志错误输出:
01-30 00:27:18.615: E/WindowManager(20316): Activity com.test.PreSetupActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@418e0c28 that was originally added here
01-30 00:27:18.615: E/WindowManager(20316): android.view.WindowLeaked: Activity com.test.PreSetupActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@418e0c28 that was originally added here
01-30 00:27:18.615: E/WindowManager(20316): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:343)
01-30 00:27:18.615: E/WindowManager(20316): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:245)
01-30 00:27:18.615: E/WindowManager(20316): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193)
01-30 00:27:18.615: E/WindowManager(20316): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118)
01-30 00:27:18.615: E/WindowManager(20316): at android.view.Window$LocalWindowManager.addView(Window.java:537)
01-30 00:27:18.615: E/WindowManager(20316): at …Run Code Online (Sandbox Code Playgroud) 如何追踪Android开发中的内存泄漏?我正在开发eclipse IDE来开发应用程序.我无法找到如何纠正内存或窗口泄漏例外?任何的想法.
主要是窗口泄漏错误会引发非法参数异常?如何纠正这两个og.请帮忙.
我有两个类一个适配器和一个活动,我有一个dailog,我在适配器中显示.当我试图更改屏幕方向时,我收到错误.我尝试在我的活动中覆盖以下代码.但似乎没什么用
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d(TAG, "configuration changed : " +newConfig);
}
Run Code Online (Sandbox Code Playgroud)
下面是我的适配器代码
public AddressPopUpAdapter(Activity activity, Activity parent,
int resourceId, ArrayList<PopUpMenu> items, int renderer) {
super(activity, resourceId, items);
this.items = items;
this.renderer = renderer;
this.activity = activity;
this.parentActivity = parent;
popupMenuUtils = new PopupMenuUtils();
dialog = new Dialog(parentActivity);
}
public View getView(int position, View convertView, ViewGroup parent) {
popUpMenu = items.get(position);
Log.d(TAG, "location" + popUpMenu);
if (popUpMenu == null) {
return null;
}
Log.d(TAG, "location" + popUpMenu); …Run Code Online (Sandbox Code Playgroud)