0

私はAndroidコーディングにかなり慣れていません。
一定時間後にデバイスの壁紙を継続的に変更するアプリを作成しました。壁紙は、SD カードのフォルダーから選択されます。私は Android/Java コーディングについてほとんど何も考えていないので、このアプリを開発するのに 2 か月かかりました。とにかく、これまでのところ、問題なく apk をビルドできます。アプリも正常に動作します。ただし、デバイスのメモリを大量に消費します。150MB以上のRAMのように!! これは良くなく、Androidもアプリを頻繁に殺します。

以下にコードを掲載しています。壁紙の変更は、以下のコードによって行われます。IntentService クラス。

誰かがこのコードを調べて、なぜそんなに多くのリソースを消費するのか、また、意図した目的でアプリをコーディングするための解決策を教えていただければ幸いです。

編集 1:メモリ消費量が多いのは、アプリが常にバックグラウンドで実行されていることが原因であることがわかりました。壁紙を設定したらアプリを強制終了し、遅延時間後に再度実行することはできますか?

 public class ChangeWallpaper extends IntentService {
     public static volatile boolean shouldContinue = true;
     public File[] files_Chosen;
     public ArrayList<String> File_String = new ArrayList<String>();
     public ArrayList<String> File_Array = new ArrayList<String>();


     public ChangeWallpaper() {
         super(ChangeWallpaper.class.getName());
        //setIntentRedelivery(true);
     }

     @Override
     protected void onHandleIntent(Intent myintent) {
         dostuff(myintent);
     }


     private void dostuff(Intent myintent) {
         int hours_delay = myintent.getIntExtra("hours_delay", 0);
         int minutes_delay = myintent.getIntExtra("minutes_delay", 1);
         String m_chosen = myintent.getStringExtra("m_chosen");

              File_Array = myinent.getStringArrayListExtra("File_String");
         WallpaperManager myWallpaper = WallpaperManager.getInstance(getApplicationContext());

 //Caution: Infinite loop
          while (true) {
            if (!shouldContinue) {
                 stopSelf();
                 return;
             }

             for (int i = 0; i < File_Array.size(); i++) {
                 Bitmap bitmap = BitmapFactory.decodeFile(File_Array.get(i));
                 try {
                     myWallpaper.setBitmap(bitmap);


                 } catch (IOException e) {
                     e.printStackTrace();

                 }

                 try {
                    TimeUnit.HOURS.sleep(hours_delay);
                    TimeUnit.MINUTES.sleep(minutes_delay);

                     repeatStuff(m_chosen);


                 } catch (InterruptedException e) {
                     e.printStackTrace();

                 }

             }
             repeatStuff(m_chosen);

         }


     }

     public void repeatStuff(String m_chosen)
     {
         final String m_chosen1 = m_chosen;
         SimpleFileDialog FolderChooseDialog = new SimpleFileDialog(ChangeWallpaper.this, "FolderChoose",
                 new SimpleFileDialog.SimpleFileDialogListener() {
                     @Override
                     public void onChosenDir(String m_chosen1) {


                         File pathVar = new File(m_chosen1);
                         FilenameFilter imageFilter = new FilenameFilter() {
                             public boolean accept(File dir, String name) {
                                 String lowercaseName = name.toLowerCase();
                                 if (lowercaseName.endsWith(".jpg") || lowercaseName.endsWith(".jpeg")
                                         || lowercaseName.endsWith(".png")
                                         || lowercaseName.endsWith(".gif")) {
                                     return true;
                                 } else {
                                     return false;
                                 }
                             }
                         };


                         File[] files = pathVar.listFiles(imageFilter);

                         if (files.length > 1) {


                             files_Chosen = files;

                             for (int i = 0; i < files.length; i++) {
                                 File_String.add(files[i].toString());
                             }

                             File_Array = File_String;

                         }

                     }
                 });
     }

 }
4

2 に答える 2

0

新しい壁紙を設定する前に、壁紙をクリアしてみてください:

private void doStuff(Intent myIntent){

...

  for (int i = 0; i < File_Array.size(); i++) {
             Bitmap bitmap = BitmapFactory.decodeFile(File_Array.get(i));
             try {
                 myWallpaper.clear();
                 myWallpaper.setBitmap(bitmap);


             } catch (IOException e) {
                 e.printStackTrace();

             }

またはメソッド myWallpaper.forgetLoadedWallpaper(); を使用してみてください。(最小 API 14)

于 2015-01-25T10:20:21.123 に答える
0

ビットマップの縮小版を使用してください。貴重なメモリを大幅に節約できるため、問題が解決する可能性があります。次の Android 開発者ガイドでは、それについての詳細な説明を提供します。

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

于 2015-01-25T04:55:26.847 に答える