2013-07-04 3 views
0

좋아 젤리 작동하지, 나는 삼성 갤럭시 Y와 삼성 갤럭시 에이스 듀오 내 라이브 배경 화면을 테스트,하지만 난이 엑스 페리아 E와 엑스 페리아 J에서 테스트 할 때, 그것은 말한다 "불행히도 라이브 벽지가 예기치 않게 멈췄습니다." API 레벨 17로 에뮬레이터에서 테스트했습니다. 정상적으로 작동했습니다. WallpaperEngine 클래스의이 앱은 생강 빵에 작업을하지만,

 public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
    } 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

/*Method called when the Live Wallpaper loads on device.*/ 
@Override 
public Engine onCreateEngine() { 
    context = this; 
    return new MyWallpaperEngine(); 

} 

/*Creating a context to refer to the class.*/ 
Context context; 

/정의/

 private class MyWallpaperEngine extends Engine implements SharedPreferences.OnSharedPreferenceChangeListener{ 

     /*Instance Variables of the above class.*/ 
     private final Handler handler = new Handler(); 
     private SharedPreferences mPreferences; 
     private String    mMode = "random"; 
     private final Runnable drawRunner = new Runnable() { 
     public void run() { 
      draw(); 
     } 
     }; 
     public Bitmap[] image = new Bitmap[26]; 
     private boolean visible; 
     private int i ; 


     public MyWallpaperEngine() { 


     image[0] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image1); 
     image[1] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image2); 
     image[2] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image3); 
     image[3] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image4); 
     image[4] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image5); 
     image[5] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image6); 
     image[6] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image7); 
     image[7] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image8); 
     image[8] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image9); 
     image[9] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image10); 
     image[10] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image11); 
     image[11] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image12); 
     image[12] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image13); 
     image[13] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image14); 
     image[14] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image15); 
     image[15] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image16); 
     image[16] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image17); 
     image[17] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image18); 
     image[18] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image19); 
     image[19] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image20); 
     image[20] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image21); 
     image[21] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image22); 
     image[22] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image23); 
     image[23] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image24); 
     image[24] = BitmapFactory.decodeResource(getResources(), 
       R.drawable.image25); 

     mPreferences = LiveWallpaper.this.getSharedPreferences(SHARED_PREFS_NAME, 0); 
     mPreferences.registerOnSharedPreferenceChangeListener(this); 
     onSharedPreferenceChanged(mPreferences,null); 
     handler.post(drawRunner); 
    } 

      public void onSharedPreferenceChanged(
      SharedPreferences prefs, String key) { 
     mMode = prefs.getString("livewallpaper_mode", "random"); 

    } 

    @Override 
    public void onCreate(SurfaceHolder surfaceHolder) 
    { 
     super.onCreate(surfaceHolder); 
     setTouchEventsEnabled(true); 

    } 


    @Override 
    public void onDestroy() 
    { 
     super.onDestroy(); 
     handler.removeCallbacks(drawRunner); 
     System.gc(); 
    } 

    @Override 
    public void onVisibilityChanged(boolean visible) { 
     this.visible = visible; 
     if (visible) { 
      handler.post(drawRunner); 
     } else { 
      handler.removeCallbacks(drawRunner); 
     } 
    } 

    @Override 
    public void onSurfaceCreated(SurfaceHolder holder) 
    { 
     super.onSurfaceCreated(holder); 
    } 

    @Override 
    public void onSurfaceDestroyed(SurfaceHolder holder) { 
     super.onSurfaceDestroyed(holder); 
     this.visible = false; 
     handler.removeCallbacks(drawRunner); 
    } 

    @Override 
    public void onSurfaceChanged(SurfaceHolder holder, int format, 
      int width, int height) { 
     super.onSurfaceChanged(holder, format, width, height); 
    } 

    private void draw() { 
     Random random = new Random();// Creates a new random generator. 
     SurfaceHolder holder = getSurfaceHolder();//Creates a surface controller 
     Canvas canvas = null;//Sets the canvas to null 
     try { 
      canvas = holder.lockCanvas(); 
      if (canvas != null) { 
       DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
       int width = metrics.widthPixels;//Gets the metrics width 
       int height = metrics.heightPixels;//Gets the metrics height 
        if(mMode.compareToIgnoreCase("aerial") == 0){ 

         i = AERIAL_MIN + random.nextInt(AERIAL_MAX); 
         canvas.drawBitmap(Bitmap.createScaledBitmap(image[i], 
           width, height, false), 0, 0, null); 
        }else if(mMode.compareToIgnoreCase("pitchside")==0){ 
         i = AERIAL_MAX + random.nextInt(PITCH_MAX-AERIAL_MAX); 
         canvas.drawBitmap(Bitmap.createScaledBitmap(image[i], 
           width, height, false), 0, 0, null); 
        }else if(mMode.compareToIgnoreCase("stadium")==0){ 
         i = PITCH_MAX + random.nextInt(STAD_MAX-PITCH_MAX); 
         canvas.drawBitmap(Bitmap.createScaledBitmap(image[i], 
           width, height, false), 0, 0, null); 
        }else { 
         i = random.nextInt(STAD_MAX); 
         canvas.drawBitmap(Bitmap.createScaledBitmap(image[i], 
           width, height, false), 0, 0, null); 
        }  
      } 
     } finally { 
      if (canvas != null) 
       holder.unlockCanvasAndPost(canvas); 
     } 
     handler.removeCallbacks(drawRunner); 
     if (visible) { 
      handler.postDelayed(drawRunner, 10000);//Called to delay(pause the thread)  the image by 10000 milliseconds 
     } 
     } 
    } 
    } 

로그 캣 : 당신은 당신의 메모리에 25 개 이미지를로드

 07-06 21:50:28.807: W/dalvikvm(14567): threadid=1: thread exiting with uncaught exception (group=0x40cfa498) 
    07-06 21:50:28.907: W/BugSenseHandler(14567): Transmitting crash Exception Unable to resolve host "bugsense.appspot.com": No address associated with hostname 
    07-06 21:50:31.857: E/test(14567): Exception 
    07-06 21:50:31.857: E/test(14567): OutOfMemoryError 
    07-06 21:50:32.487: E/dalvikvm(14567): can't open /mnt/sdcard/20130706-162031.hprof: Permission denied 
    07-06 21:50:32.497: E/test(14567): writeHprofDataToFile: caught java.lang.RuntimeException: Failure during heap dump; check log output for details 
    07-06 21:50:32.507: E/AndroidRuntime(14567): FATAL EXCEPTION: main 
    07-06 21:50:32.507: E/AndroidRuntime(14567): java.lang.OutOfMemoryError 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:500) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:353) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:376) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:406) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at app.sunny.soccerstadiumlivewallpaper.LiveWallpaper$MyWallpaperEngine.<init> (LiveWallpaper.java:118) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at app.sunny.soccerstadiumlivewallpaper.LiveWallpaper.onCreateEngine(LiveWallpaper.java:59) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:1012) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at android.os.Handler.dispatchMessage(Handler.java:99) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at android.os.Looper.loop(Looper.java:137) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at android.app.ActivityThread.main(ActivityThread.java:4792) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at java.lang.reflect.Method.invokeNative(Native Method) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at java.lang.reflect.Method.invoke(Method.java:511) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:808) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:575) 
    07-06 21:50:32.507: E/AndroidRuntime(14567): at dalvik.system.NativeStart.main(Native Method) 
+3

후 당신의 로그 캣 – ianhanniballake

+0

를 보라. 나는 APK를 설치했다. – user2125722

+1

더 높은 dpi 장치 화면으로 인해 코드에서 이미지를 설정할 때'OutOfMemoryError'로 의심됩니다. – Voicu

답변

0

: 이미지 [24] = BitmapFactory.decodeResource (getResources(), R.drawable.image25); 그런데 왜 그렇게합니까?

나는 당신이 (당신이 할 수없는, 화면이 너무 작) 같은 시간에 그들 모두를 보여주지 못할 것이다 생각합니다. 따라서 이미지 을 읽으려면 만 요청하십시오. 그리고 약간의 엄지 손가락을 보여주고 싶다면 그 중 일부를 만들고 그 작은 그림을 drawable/res 폴더에 넣으십시오.

당신은 당신의 기억에 하나 개 이상의 이미지가 안됩니다.

또한 USB 디버깅에 의해 내가 장치에서 테스트하지 않았다 http://developer.android.com/training/best-performance.html