2012-09-13 1 views
0

페이지에서보기를 세로에서 가로로 여러 번 뒤로 변경합니다 (예 : 5-15 배 행)에서 응용 프로그램이 충돌합니다. 오류 텍스트는 다음과 같습니다.액티비티를 세로에서 가로로, 뒤로 여러 번 (연속 5-15 회) 움직이면 응용 프로그램이 충돌합니다.

09-07 16:18:16.976: D/AndroidRuntime(4215): Shutting down VM 
09-07 16:18:16.976: W/dalvikvm(4215): threadid=1: thread exiting with uncaught exception (group=0x40a2d1f8) 
09-07 16:18:16.992: E/AndroidRuntime(4215): FATAL EXCEPTION: main 
09-07 16:18:16.992: E/AndroidRuntime(4215): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.mobileTimerClock/com.android.mobileTimerClock.TimeClockDashBoard}: android.view.InflateException: Binary XML file line #3: Error inflating class <unknown> 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3351) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.access$700(ActivityThread.java:123) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1151) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.os.Looper.loop(Looper.java:137) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.main(ActivityThread.java:4424) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at java.lang.reflect.Method.invokeNative(Native Method) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at java.lang.reflect.Method.invoke(Method.java:511) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at dalvik.system.NativeStart.main(Native Method) 
09-07 16:18:16.992: E/AndroidRuntime(4215): Caused by: android.view.InflateException: Binary XML file line #3: Error inflating class <unknown> 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.createView(LayoutInflater.java:606) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:653) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.inflate(LayoutInflater.java:466) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.Activity.setContentView(Activity.java:1835) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at com.android.mobileTimerClock.TimeClockDashBoard.onCreate(TimeClockDashBoard.java:488) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.Activity.performCreate(Activity.java:4465) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
09-07 16:18:16.992: E/AndroidRuntime(4215): ... 12 more 
09-07 16:18:16.992: E/AndroidRuntime(4215): Caused by: java.lang.reflect.InvocationTargetException 
09-07 16:18:16.992: E/AndroidRuntime(4215): at java.lang.reflect.Constructor.constructNative(Native Method) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.LayoutInflater.createView(LayoutInflater.java:586) 
09-07 16:18:16.992: E/AndroidRuntime(4215): ... 24 more 
09-07 16:18:16.992: E/AndroidRuntime(4215): Caused by: java.lang.OutOfMemoryError 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.Bitmap.nativeCreate(Native Method) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.Bitmap.createBitmap(Bitmap.java:605) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.Bitmap.createBitmap(Bitmap.java:551) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.content.res.Resources.loadDrawable(Resources.java:1935) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.View.<init>(View.java:2785) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.view.ViewGroup.<init>(ViewGroup.java:385) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.widget.FrameLayout.<init>(FrameLayout.java:99) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.widget.ScrollView.<init>(ScrollView.java:152) 
09-07 16:18:16.992: E/AndroidRuntime(4215): at android.widget.ScrollView.<init>(ScrollView.java:148) 
09-07 16:18:16.992: E/AndroidRuntime(4215): ... 27 more 
09-07 16:18:17.078: W/ActivityManager(181): Force finishing activity com.android.mobileTimerClock/.TimeClockDashBoard 
+0

이미지가있는 경우 대부분의 시간이 충돌합니다. –

+0

레이아웃 파일을 넣는 것이 좋습니다. – VendettaDroid

답변

3

OutOfMemoryError이 표시됩니다. 당신의 활동은 어떤가요? 어떤 Android 버전을 사용하고 있습니까? 당신의 활동에 큰 비트 맵이나 WebView가 있습니까?

더 많은 정보를 제공하거나 메모리 누수를 시도해야합니다. Eclipse Memory Analyzer은 도움이되는 유용한 도구입니다. 파괴되는 활동에 대한 참조가있는 항목이 있는지 여부를 확인하여 가비지 수집을 방지 할 수 있습니다. This blog post은 몇 가지 기본적인 사용법을 알려줍니다.

업데이트 :AsyncTask 인스턴스는 아마도 호스트 활동에 대한 참조를 보유하고있을 것입니다. AsynTask이 활동의 ​​정적이 아닌 내부 클래스 인 경우 특히 그렇습니다. 따라서 회전 할 때 명시 적으로 작업을 중지하지 않는 한 새 작업이 실행되지 않고 기존 작업 will keep running이 실행됩니다.

이러한 작업이 호스트 활동을 참조 할 때마다 메모리 문제가 발생할 가능성이 있습니다.

이 문제를 해결하려면 Mark Murphy의 blog post을 참조하십시오.

샘플 프로젝트는 AsyncTask 구현을 정적 내부 클래스로 표시합니다. 이 작업은 onRetainNonConfigurationInstance()에서 반환되며 호스팅 활동은 방향 변경 전후에 AsyncTask가 사용할 올바른 Activity 인스턴스를 알고 있는지 확인해야합니다.

기본적으로 작업에서 소멸 될 호스트 활동을 적절하게 "분리"해야합니다. 거기에서, 당신까지. 이전 활동에서 새 활동으로 실행중인 태스크를 전달하거나 실행을 중지하도록 시도 할 수 있습니다. 여기에 열쇠는 이 아니며이 이 아닌 한 AsynTask의 내부 클래스를 사용하십시오.

+0

android 2.3 버전, 나는 웹 view.on create.Asynctask를 사용할 때마다 호출됩니다. –

+0

업데이트 된 답변보기. – wsanville

-1

대부분의 경우 비트 맵과 같은 일부 개체가 파괴되거나 다시 생성 될 때 작업이 취소되거나 다시 생성되지 않으므로 OutOfMemoryException이 표시 될 수 있습니다.

먼저 코드를 검사하여 메모리 누수가 있으면 찾아서 제거하십시오. 당신이 당신의 활동에 큰 비트 맵 또는 배경이있는 경우 그런 다음이 클래스에서 활동을 확장하려고

는 : 활동이 파괴 될 때 어떤 당김을 null로하려고합니다

public abstract class AdvancedActivity extends Activity 
{ 

    @Override 
    protected void onResume() 
    { 
    System.gc(); 
    super.onResume(); 
    } 

    @Override 
    protected void onPause() 
    { 
    super.onPause(); 
    System.gc(); 
    } 

    @Override 
    public void setContentView(int layoutResID) 
    { 
    ViewGroup mainView = (ViewGroup) 
     LayoutInflater.from(this).inflate(layoutResID, null); 

    setContentView(mainView); 
    } 

    @Override 
    public void setContentView(View view) 
    { 
    super.setContentView(view); 
    m_contentView = (ViewGroup)view; 
    } 

    @Override 
    public void setContentView(View view, LayoutParams params) 
    { 
    super.setContentView(view, params); 

    m_contentView = (ViewGroup)view; 
    } 

    @Override 
    protected void onDestroy() 
    { 
    super.onDestroy(); 

    // Fixes android memory issue 8488 : 
    // http://code.google.com/p/android/issues/detail?id=8488 
    nullViewDrawablesRecursive(m_contentView); 

    m_contentView = null; 
    System.gc(); 
    } 

    private void nullViewDrawablesRecursive(View view) 
    { 
    if(view != null) 
    { 
     try 
     { 
     if (view instanceof ViewGroup) { 
      ViewGroup viewGroup = (ViewGroup)view; 
      int childCount = viewGroup.getChildCount(); 
      for(int index = 0; index < childCount; index++) 
      { 
       nullViewDrawablesRecursive(viewGroup.getChildAt(index)); 
      } 
     } 
     } 
     catch(Exception e) 
     {   
     } 

     nullViewDrawable(view); 
    }  
    } 

    private void nullViewDrawable(View view) 
    { 
    try 
    { 
     view.setBackgroundDrawable(null); 
    } 
    catch(Exception e) 
    {   
    } 

    try 
    { 
     ImageView imageView = (ImageView)view; 
     imageView.setImageDrawable(null); 
     imageView.setBackgroundDrawable(null); 
    } 
    catch(Exception e) 
    {   
    } 
    } 

    // The top level content view. 
    private ViewGroup m_contentView = null; 
} 

(그것은 나를 위해 일한) . 표준이고 좋은 방법은 아니지만, 적어도 2 회전 후에 OOM을 얻었을 때 적어도 저에게는 효과적이었습니다!

+0

감사합니다. 귀하의 code.i를 구현했습니다. 내 응용 프로그램이 비동기 작업으로 인해 추락했다고 생각합니다. 충돌을 피할 수있는 방법을 알려주십시오. –

+0

비동기 작업을 한 번만 실행하려면 비동기 작업을 실행하려면 –

+0

@ user1661263 wsanville에서 제공 한 링크에서 프로젝트를 확인해야한다고 생각합니다. https : // github. co.kr/commonsguy/cw-android/tree/master/Rotation/RotationAsync/ – yrajabi

관련 문제