2011-01-18 6 views
2

この問題に関する多くの記事を読みましたが、コードに当てはまるものを見つけることはできません(少なくとも関連付けることができます)。ビットマップサイズがVM予算を超えています

私は、風景と肖像の両方で表示されるホーム画面ウィジェットを持っています。私は継続的に、デバイスの向きを変更した場合、私は私のlogcatでこれを取得する:

public class WidgetLayoutBuilder { 

public static final String DEG = "\u00B0"; 

public static final int LAYOUT_CURRENT = 1000; 
public static final int LAYOUT_FORECAST = 1001; 

/** 
    * Constructs current conditions layout. 
    * 
    * @param context 
    * @param wd 
    * @return 
    */ 
public static RemoteViews buildCurrentLayout(Context context, int appWidgetId, ACCUWX_WeatherData wd){ 
    Log.d("########", "remoteViews buildCurrentLayout"); 
    // Return object 
    RemoteViews toRet = new RemoteViews(context.getPackageName(), R.layout.widget_current_layout); 

    String cityText = wd.getCityName(); 
    String tempUnits = wd.getMetric() == 0 ? "F" : "C"; 
    String iconId = "icon_" + wd.getCurrentIconCode(); 

    // Populate views with weather data 
    toRet.setTextViewText (R.id.current_location_text, cityText); 
    toRet.setTextViewText (R.id.current_temp_text, wd.getCurrentTemperature() + DEG + tempUnits); 
    toRet.setTextViewText (R.id.current_conditions_text, wd.getCurrentConditions()); 
    toRet.setImageViewResource (R.id.current_condition_image, ACCUWX.getDrawableId(iconId)); 
    toRet.setTextViewText (R.id.current_hi_temp, context.getString(R.string.hi) + ": " + wd.getForecast().get(0).getDailyHigh() + DEG); 
    toRet.setTextViewText (R.id.current_lo_temp, context.getString(R.string.lo) +": " + wd.getForecast().get(0).getDailyLow() + DEG); 

    // Make alert icon visible if necessary. 
    int visibility = wd.getAlertIsActive() == 0 ? View.INVISIBLE : View.VISIBLE; 
    toRet.setViewVisibility(R.id.alert_icon, visibility); 

    if (MainActivity.mLocations == null) 
    MainActivity.mLocations = new ArrayList<String>(); 
    if (MainActivity.mLocName == null) 
    MainActivity.mLocName = new String(""); 


    if (!MainActivity.mLocations.contains(wd.getZipCode()) || !MainActivity.mLocName.contains(wd.getCityName())) 
    MainActivity.mLocations.add(wd.getZipCode()); 

    MainActivity.isFromLocationSearchActivity = false; 

    // Launch SimpleWeather application intent 
    Intent intentAppLaunch = new Intent(context, MainActivity.class); 
    intentAppLaunch.putExtra(ACCUWX.Extras.LOCATION_CODE, wd.getZipCode()); 
    intentAppLaunch.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent pendingAppLaunch = PendingIntent.getActivity(context, appWidgetId, intentAppLaunch, PendingIntent.FLAG_CANCEL_CURRENT); 
    toRet.setOnClickPendingIntent(R.id.current_layout, pendingAppLaunch); 

    return toRet; 
} 

/** 
    * Returns pretty names for display purposes in the form 'city name, state name' for the US and 'cityname, countryname (region)' for other countries. 
    * @return 
    */ 
public static String getPrettyName(ACCUWX_WeatherData wd){ 
     String prettyName = "null"; 

     String state = wd.getStateName(); 
     String city = wd.getCityName(); 
     String country = wd.getCountryName(); 
     String countryCode = wd.getCountryCode(); 

     if (countryCode.equalsIgnoreCase("us")) 
      prettyName = city + ", " + state; 
     else 
      prettyName = city + ", " + country + " (" + state + ")"; 

     return prettyName; 
} 


/** 
    * Constructs deleted layout. 
    * 
    * @param context 
    * @return 
    */ 
public static RemoteViews buildDeletedLayout(Context context){ 
    Log.d("########", "remoteViews buildDeletedLayout"); 
    return new RemoteViews(context.getPackageName(), R.layout.widget_deleted_layout); 

} 

} 

ビットマップエラーはデバイス自体から来ていないことでした:

03-08 10:41:35.793: ERROR/dalvikvm-heap(1159): 4707316-byte external allocation too large for this process.
03-08 10:41:35.793: ERROR/GraphicsJNI(1159): VM won't let us allocate 4707316 bytes
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): updateAppWidget couldn't find any view, using error view
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): android.view.InflateException: Binary XML file line #1: Error inflating class android.widget.LinearLayout
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.view.LayoutInflater.createView(LayoutInflater.java:513)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.view.LayoutInflater.inflate(LayoutInflater.java:385)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.widget.RemoteViews.apply(RemoteViews.java:930)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.appwidget.AppWidgetHostView.updateAppWidget(AppWidgetHostView.java:219)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.appwidget.AppWidgetHostView.updateAppWidget(AppWidgetHostView.java:155)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.appwidget.AppWidgetHost.createView(AppWidgetHost.java:218)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at com.android.launcher2.Launcher.bindAppWidget(Launcher.java:2393)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at com.android.launcher2.LauncherModel$Loader$LoaderThread$7.run(LauncherModel.java:1051)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at com.android.launcher2.DeferredHandler$Impl.handleMessage(DeferredHandler.java:48)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.os.Handler.dispatchMessage(Handler.java:99)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.os.Looper.loop(Looper.java:123)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.app.ActivityThread.main(ActivityThread.java:4645)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at java.lang.reflect.Method.invokeNative(Native Method)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at java.lang.reflect.Method.invoke(Method.java:521)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at dalvik.system.NativeStart.main(Native Method)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): Caused by: java.lang.reflect.InvocationTargetException
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.widget.LinearLayout.(LinearLayout.java:115)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at java.lang.reflect.Constructor.constructNative(Native Method)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.view.LayoutInflater.createView(LayoutInflater.java:500)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): ... 19 more
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.graphics.Bitmap.nativeCreate(Native Method)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.graphics.Bitmap.createBitmap(Bitmap.java:435)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.content.res.Resources.loadDrawable(Resources.java:1718)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.view.View.(View.java:1885)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.view.View.(View.java:1834)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): at android.view.ViewGroup.(ViewGroup.java:285)
03-08 10:41:35.793: WARN/AppWidgetHostView(1159): ... 23 more

私のコードはremoteViewsを利用するこのです私のアプリケーションの問題?

ご不便をおかけしますようお願い申し上げます。

+0

taralocaのuを助けること

希望は、あなたが問題を見つけるために管理するのですか?それはHOMEアプリに関連しているようです。 –

+0

可能な複製[java.lang.OutOfMemoryError:ビットマップサイズがVM予算を超えています - Android](http://stackoverflow.com/questions/1949066/java-lang-outofmemoryerror-bitmap-size-exceeds-vm-budget-android) –

答えて

2

bitmap size exceeds VM budget

これはメモリリークの単なる一般的なエラーです。 実際のデバイスでDDMSやさまざまな無料のアプリを使ってメモリ使用量を監視すれば、爆弾が出るまでメモリ使用量が増え続けるのがわかります(私にとっては約28MBでした)。

あなたはメモリリークを経験しています。あなたはすべてのソースコードを持っているので、あなたはそれを見つけることができます。ロードされたビットマップと解放されていないビットマップ、およびカーソルがロードされ、閉じられていないことを確認します。

+0

DDMSを使用すると、ビットマップが「閉じられていない」ことをどのように知ることができますか? – Jacksonkr

+1

誰かが@Jacksonの質問に答えることができますか? – Enigma

+0

@Enigma新しい質問を投稿してください。 – Aliostad

0

私はこのインターアンドロイドブロックのコミュの本当にaffraid午前:

if (MainActivity.mLocations == null) 
    MainActivity.mLocations = new ArrayList<String>(); 
if (MainActivity.mLocName == null) 
    MainActivity.mLocName = new String(""); 

if (!MainActivity.mLocations.contains(wd.getZipCode()) 
     || !MainActivity.mLocName.contains(wd.getCityName())) 
    MainActivity.mLocations.add(wd.getZipCode()); 

MainActivity.isFromLocationSearchActivity = false; 
0

このライン:

ACCUWX.getDrawableId(iconId) 

あなたの描画可能で、それが必要以上に大きくないことを確認してください。ビットマップを読み込むと、最初に境界線を読み込んだ後に拡大縮小し、縮小したバージョンを読み込むことができます。オリエンテーション変化に

  • リサイクル古いビットマップ
  • のみ、私は同じ問題を抱えていたスケーリングされたバージョン
関連する問題