2014-03-13 28 views
0

我創建一個圖像幻燈片類型的應用程序,我的應用程序使用線程。應用程序關閉一段時間後android

我的應用程序運行成功,但一段時間後應用程序突然關閉。

我使用的代碼下面一行來釋放內存

System.gc(); 
Runtime.getRuntime().gc(); 

沒有上面的代碼相同的問題出現。

的logcat:

03-13 12:45:09.250/dalvikvm: 
@@@ ABORTING: DALVIK: HEAP MEMORY CORRUPTION IN internal_bulk_free addr=0x0 
20713 20715 F03-13 12:45:09.250/libc 
Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 20715 (GC) 

如何解決我的問題?

請幫幫我。

我的代碼是:

public class MyRunnable implements Runnable { 

      private int delayTime = 0; 
      private Vector<Integer> my_PlaylistRecord_ContentIds =new Vector<Integer>(); 
      private Vector<Integer> delayArray =new Vector<Integer>(); 

      private Vector<Long> video_Duration_List = new Vector<Long>(); 

      private Vector<Integer> relative_Ids = new Vector<Integer>(); 
      private Vector<RelativeLayout> layouts = new Vector<RelativeLayout>(); 


      private RelativeLayout customRelativeLayout ; 

      private ArrayList<String> _idArray; 
      private ArrayList<String> _delayArray; 

      private int countPlus = 0; 

      private int totalSize = 0; 

      private ArrayList<Playlist_record> playlist_records; 


      private FinalPlaylist finalPlaylist; 

      private int fullscreenId =0; 
      private int screenId =0; 
      private int screenIndex =0; 

      private long videoDuration = 0; 


      public MyRunnable(ArrayList<Integer> _playlistRrecord_ContentIds, FinalPlaylist _finalPlaylist, List<Integer> delayLists, List<Long> videoDurationList) { 

       finalPlaylist = _finalPlaylist; 

       for (Integer id : _playlistRrecord_ContentIds) { 
        //System.out.println("content id:"+id); 
        my_PlaylistRecord_ContentIds.add(id); 
       } 
       for (Integer string : delayLists) { 
        //System.out.println("delay time :"+string); 
        delayArray.add(string); 
       } 


       for (Long videoDuration : videoDurationList) { 
        video_Duration_List.add(videoDuration); 
       } 
       totalSize = delayArray.size(); 

       Iterator<Integer> myVeryOwnIterator = layoutMap.keySet().iterator(); 
       while(myVeryOwnIterator.hasNext()) { 

        int key=(Integer) myVeryOwnIterator.next(); 

        System.out.println("key:"+key); 

         customRelativeLayout = layoutMap.get(key); 
         //System.out.println(" test customRelativeLayout.getChildCount():"+customRelativeLayout.getChildCount()); 
         layouts.add(customRelativeLayout); 
         relative_Ids.add(key); 
       } 


       // Find screen s 



       List<Container> containers = appDataBase.getAllCotainer(); 
       for (Container container : containers) { 

        if(container.getName().equals("S")){ 
          System.out.println("screen INVISIBLE index:"); 
          screenId = container.getContainer_id(); 
          System.out.println(" index :"+screenId); 
        } 
        if(container.getName().equals("FS")){ 
         fullscreenId = container.getContainer_id(); 
        } 

       } 

       // find index number of screen s container 
       for (int i = 0 ; i < relative_Ids.size() ; i++) { 

        if(screenId == relative_Ids.get(i)){ 
         screenIndex = i; 
        } 
       } 

       /* for (int i = 0 ; i < relative_Ids.size() ; i++) { 

       List<Container> containers = appDataBase.getAllCotainer(); 
       for (Container container : containers) { 

        if(container.getName().equals("FS")){ 
          System.out.println("Full screen INVISIBLE index:"+i); 
          RelativeLayout relativeLayout = layouts.get(i); 
          //relativeLayout.setVisibility(View.INVISIBLE); 
          layouts.set(i, relativeLayout); 

         } else if(container.getName().equals("S")){ 

          System.out.println("screen INVISIBLE index:"+i); 

          RelativeLayout relativeLayout = layouts.get(i); 
          relativeLayout.setVisibility(View.INVISIBLE); 
          layouts.set(i, relativeLayout); 

        } 

       } 

      }*/ 

     } 

     public void run() { 

       System.out.println("screen container id:"+screenId); 

       while(IS_THREAD_RUN){ 


        if(countPlus < totalSize){ 

        Runnable iRunnable= new Runnable() { 
          public void run() { 



         // System.out.println(" ** countPlus:"+ countPlus); 
          // System.out.println(" ** totalSize:"+ totalSize); 
          // System.out.println("my_playlist_ids size:"+my_PlaylistRecord_ContentIds.size()); 
          // System.out.println("my_playlist_ids content:"+my_PlaylistRecord_ContentIds.get(countPlus)); 


           // Get all playlist record 

           List<Playlist_record> playlist_records = finalPlaylist.getPlayerArray(); 
           Playlist_record playlist_record = playlist_records.get(countPlus); 

           //System.out.println("test run container id:"+playlist_record.getContainer_id()); 


           // *********************************** 
           // Check playlist_record validation 
           // *********************************** 

           //System.out.println("playlist_recordId:"+my_playlist_ids.get(countPlus)); 


          boolean isvalidContent = false; 
          isvalidContent = appDataBase.isPlayContent(playlist_record.getPlaylist_record_id()); 
          System.out.println("Valid Content:"+isvalidContent); 

          if(isvalidContent){ 
          // Hide layout, Fetch all container data and get name equals to FS and S then relative layout 

           /* 
           for (int i = 0 ; i < relative_Ids.size() ; i++) { 

            List<Container> containers = appDataBase.getAllCotainer(); 
            for (Container container : containers) { 

             if(container.getName().equals("FS")){ 
               System.out.println("Full screen INVISIBLE index:"+i); 
               RelativeLayout relativeLayout = layouts.get(i); 
               //relativeLayout.setVisibility(View.INVISIBLE); 
               layouts.set(i, relativeLayout); 

              } else if(container.getName().equals("S")){ 

               System.out.println("screen INVISIBLE index:"+i); 

               RelativeLayout relativeLayout = layouts.get(i); 
               relativeLayout.setVisibility(View.INVISIBLE); 
               layouts.set(i, relativeLayout); 

             } 

            } 
           }*/ 

            //System.out.println(" layouts:"+layouts.toString()); 

            for (int i = 0 ; i < relative_Ids.size() ; i++) { 

              if(relative_Ids.get(i) == playlist_record.getContainer_id()){ 
                //System.out.println("countainer id:"+relative_Ids.get(i)); 
               // System.out.println("playlist_record.getContainer_id():"+playlist_record.getContainer_id()); 

               customRelativeLayout = layouts.get(i); 
               // System.out.println("customRelativeLayout.getChildCount():"+customRelativeLayout.getChildCount()); 

               // Fetch all container data and get name equals to FS and S then relative layout visible 


                if(screenId == playlist_record.getContainer_id()){ 

                 customRelativeLayout.setVisibility(View.VISIBLE); 
                 //customRelativeLayout.bringToFront(); 
                }else { 

                 RelativeLayout relativeLayout = layouts.get(screenIndex); 
                 relativeLayout.setVisibility(View.INVISIBLE); 
                 layouts.set(screenIndex, relativeLayout); 
                } 

                //Weather id match 

                 try { 
                  Feature_Defination feature_Defination = appDataBase.getFeatureDefinition(relative_Ids.get(i)); 
                  if(relative_Ids.get(i)==feature_Defination.getContainerID()){ 
                    System.out.println("match"); 
                    displayWeatherData(customRelativeLayout,feature_Defination.getContainerID(),feature_Defination); 
                  } 
                 } catch (Exception e) { 
                  e.printStackTrace(); 
                 } 


               //System.out.println("transition effect:"+playlist_record.getTransition()); 

               //customRelativeLayout.setVisibility(View.VISIBLE); 

                setContent(my_PlaylistRecord_ContentIds.get(countPlus),customRelativeLayout,getAnimation(playlist_record.getTransition()),delayArray.get(countPlus)); 



              } 
            } // End for loop 


            System.out.println("my_playlist_ids:"+my_PlaylistRecord_ContentIds.get(countPlus)); 

          // setContent(my_playlist_ids.get(countPlus),customRelativeLayout); 
           countPlus =countPlus+1; 
           if(countPlus >= totalSize){ 
            countPlus = 0; 
           } 
         }else{ 
           countPlus =countPlus+2; 
           if(countPlus >= totalSize){ 
            countPlus = 0; 
           } 
         } 


         } //run method end 


        }; 

        handler.post(iRunnable); 

        }else{ 
         countPlus = 0; 
        } 

        //System.out.println("countplus before thread sleep:"+delayArray.get(countPlus)+" countPlus:"+countPlus); 
        //System.out.println("countplus sleep video duration:"+videoDuration); 

       try { 

          long sleepTime = delayArray.get(countPlus); 
         // System.out.println("sleep delay :"+sleepTime); 
          if(sleepTime==0){ 

          long videoTime = video_Duration_List.get(countPlus); 
          if(videoTime == 0){ 
           sleepTime = 1000; 
          }else{ 
           sleepTime = videoTime; 
          } 
          }else{ 
          sleepTime = (sleepTime * 1000)+1000; 

          } 
          /* 
          if(videoDuration!=0){ 
           System.out.println("sleep count plus"+countPlus); 
           countPlus = countPlus - 1; 
           if(countPlus<=0){ 
            countPlus = 0; 
           } 
           System.out.println("sleep countPlus:"+countPlus); 
          sleepTime = videoDuration; 
          }*/ 
         // new DisplayContentAsync().execute(""+my_PlaylistRecord_ContentIds.get(countPlus)); 

         System.out.println("sleep time:"+sleepTime); 
         Thread.sleep(sleepTime); 


          //Thread.sleep(2000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } // run method end 

      } 
     } 

/* class DisplayContentAsync extends AsyncTask<String, String, String>{ 

     @Override 
     protected String doInBackground(String... params) { 



        // get video file length 
        // check video 


      // ********************************************************* 



         String play_FileName = ""; 

          //Get all record from content table 
           File conFile = new File(Util.ROOT_PATH + "Contents/"+play_FileName); 
           //Check image file 
           ImageFileFilter imageFileFilter = new ImageFileFilter(conFile); 
           VideoFileFilter videoFileFilter = new VideoFileFilter(conFile); 


           Content content = appDataBase.getContentTemp(""+params[0]); 

           System.out.println("content id:"+content.getContent_id()); 
           System.out.println("content path:"+content.getContent()); 

           try { 
            String[] contentArray = null; 
            contentArray = content.getContent().split("/"); 
            play_FileName = contentArray[contentArray.length-1]; 
           } catch (Exception e2) { 
            // TODO Auto-generated catch block 
            e2.printStackTrace(); 
           } 
           String filePath = Util.ROOT_PATH + "Contents/"+conFile.getName(); 
           if(videoFileFilter.accept(conFile)){ 
             System.out.println("Video file name:"+play_FileName); 
            // Get video file play duration 
            MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
            retriever.setDataSource(filePath); 
            String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
            long time1 = Long.parseLong(time);; 
            System.out.println("video time: "+time1); 
           } 


        // setContent(my_playlist_ids.get(countPlus),customRelativeLayout); 




      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
     } 
    } 
*/ 
    @SuppressLint("NewApi") 
    public void setContent(int content_id,RelativeLayout _customRelativeLayout,List<Animation> _animations, int _videoTimeDuration){ 
     //System.gc(); 
     //Runtime.getRuntime().gc(); 

     List<Animation> animations = _animations; 

     RelativeLayout customRelativeLayout = _customRelativeLayout; 
     ImageView imageView = null; 
     VideoView videoView = null; 
     WebView webView = null; 

     int height = customRelativeLayout.getHeight(); 
     int width = customRelativeLayout.getWidth(); 
     final int videoTimeDuration = _videoTimeDuration; 

     Animation anim1 = null ; 
     Animation anim2 = null; 
     Animation anim3 = null; 

     for(int p=0; p<animations.size();p++){ 

      if(p==0){ 
       anim1 = animations.get(p); 
       System.out.println("animation 1"); 
      }else if(p==1){ 
       anim2 = animations.get(p); 
       System.out.println("animation 2"); 
      }else if(p==2){ 
       anim3 = animations.get(p); 
       System.out.println("animation 3"); 
      } 
     } 


     //System.out.println("layout height :"+height); 
     //System.out.println("layout height :"+height); 
     // Find all child from relative layout 
     int childcount = customRelativeLayout.getChildCount(); 
     //System.out.println("get all child:"+childcount); 
     for (int i=0; i < childcount; i++){ 
       View view = customRelativeLayout.getChildAt(i); 
       if (view instanceof ImageView) { 
        imageView = (ImageView) view; 
        // do what you want with imageView 
       }else if (view instanceof VideoView) { 
        videoView = (VideoView) view; 
        // do what you want with imageView 
       }else if (view instanceof WebView) { 
        webView = (WebView) view; 
        // do what you want with imageView 
       } 

     } 
     String play_FileName = ""; 

     //Get all record from content table 

      //System.out.println("content id match with:"+content_id); 
      Content content = appDataBase.getContent(""+content_id); 

      //System.out.println("content id:"+content.getContent_id()); 
      //System.out.println("content path:"+content.getContent()); 

      try { 
       String[] contentArray = null; 
       contentArray = content.getContent().split("/"); 
       play_FileName = contentArray[contentArray.length-1]; 
      } catch (Exception e2) { 
       // TODO Auto-generated catch block 
       e2.printStackTrace(); 
      } 


      System.out.println("Play file name:"+play_FileName); 
      //Toast.makeText(Display.this, play_FileName, 1000).show(); 

     //System.out.println("Play file duration:"+duration); 
     /* 
      // Set animation 

      if(animations!=null && animations.size()>=2){ 
       System.out.println("animation 2 available "); 



       final Animation endanim = anim2; 
       final RelativeLayout relativeLayout = customRelativeLayout; 

       customRelativeLayout.startAnimation(anim1); 
       anim1.setAnimationListener(new AnimationListener() { 

        @Override 
        public void onAnimationStart(Animation arg0) { 

        } 

        @Override 
        public void onAnimationRepeat(Animation arg0) { 

        } 

        @Override 
        public void onAnimationEnd(Animation arg0) { 
         relativeLayout.startAnimation(endanim); 

        } 
       }); 
      }else if(animations!=null && animations.size()==1){ 
       System.out.println("animation 1 available"); 
       imageView.setAnimation(anim1); 
      }else { 
       System.out.println("animation not available"); 
      } 
     */ 
       File conFile = new File(Util.ROOT_PATH + "Contents/"+play_FileName); 
       //Check image file 
       ImageFileFilter imageFileFilter = new ImageFileFilter(conFile); 
       VideoFileFilter videoFileFilter = new VideoFileFilter(conFile); 
       WebFileFilter webFileFilter = new WebFileFilter(conFile); 

       String filePath = Util.ROOT_PATH + "Contents/"+conFile.getName(); 
       //check file size is zero or not 
       File chkFile = new File(filePath); 
       if(chkFile.length()>0){ 
        if(imageFileFilter.accept(conFile)){ 
         //System.out.println("filter image file name:"+conFile.getName()); 
         videoView.setVisibility(View.GONE); 
         imageView.setVisibility(View.VISIBLE); 
         webView.setVisibility(View.GONE); 



         // Check android os 
         int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
         if (currentapiVersion >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH){ 
          //System.out.println("jelly bean"); 
          Drawable drawable = Drawable.createFromPath(filePath); 
          imageView.setBackground(drawable); 
          //imageView.setImageBitmap(decodeFile(chkFile, 1000, 1000)); 

          // Set animation 

          if(animations!=null && animations.size()>=2){ 
           System.out.println("animation 2 available "); 



           final Animation endanim = anim2; 
           final ImageView finalImage = imageView; 

           imageView.startAnimation(anim1); 
           anim1.setAnimationListener(new AnimationListener() { 

            @Override 
            public void onAnimationStart(Animation arg0) { 

            } 

            @Override 
            public void onAnimationRepeat(Animation arg0) { 

            } 

回答

0

你可以試試下面this.Add行Android清單文件:

android:largeHeap="true" 

感謝。

+0

是的,我使用這段代碼,但仍然是同樣的問題。 – Hemant

+0

你可以請你發佈你的java代碼。 –

+0

我發佈我的代碼檢查它。 – Hemant

相關問題