2012-07-16 19 views
0

我有一個應用程序,我建立的似乎與我有關,在內存中使用太多的最終變量的問題,當我測試應用程序在Android 2.3及以下它工作正常,但4.0和以上它崩潰後一段時間if這個列表太長了,我試圖弄清楚什麼是我可以繞過變量最終的方式,或者一種可能使它們在它們不在視圖中時可能爲空的方式?下面是我的代碼,任何幫助將很長的路要走感謝替代在java和android中使用最終變量?

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi = convertView; 
    final String url = (String) data.get(position).get(4); 
    final String aviUrl = (String) data.get(position).get(2); 
    final Date theTime = (Date) data.get(position).get(3); 
    final String theTweetText = (String) data.get(position).get(1); 
    final String theRealName = (String) data.get(position).get(0); 
    final String theScreenName = (String) data.get(position).get(5); 
    Boolean isRetweeted = (Boolean) data.get(position).get(6); 
    final Long iD = (Long) data.get(position).get(7); 
    final Integer totalTweets = (Integer) data.get(position).get(8); 
    final Integer totalFollowers = (Integer) data.get(position).get(9); 
    final Integer totalFollowing = (Integer) data.get(position).get(10); 
    final Long tweetId = (Long) data.get(position).get(11); 
    Date currentDate = new Date(); 



    if (convertView == null) 
     vi = inflater.inflate(R.layout.item, null); 

    if (isRetweeted == true) { 
     final String theRetweetedTxt = (String) data.get(position).get(12); 
     final String theRetweetedUser = (String) data.get(position).get(13); 
     final String theRetweetedImgUrl = (String) data.get(position).get(14); 
     final String theRetweetedScreenName = (String) data.get(position).get(15); 
     final Long rTiD = (Long) data.get(position).get(16); 
     final Integer rTtotalTweets = (Integer) data.get(position).get(17); 
     final Integer rTtotalFollowers = (Integer) data.get(position).get(18); 
     final Integer rTtotalFollowing = (Integer) data.get(position).get(19); 
     final Long rtTweetId = (Long) data.get(position).get(20); 


     TextView theTweet = (TextView) vi.findViewById(R.id.tweet_text); 
     TextView username = (TextView) vi.findViewById(R.id.username); 
     TextView realname = (TextView) vi.findViewById(R.id.realname); 
     TextView theTimeTv = (TextView) vi.findViewById(R.id.theTime); 

     ImageView aviimage = (ImageView) vi.findViewById(R.id.user_avatar); 
     ImageView image = (ImageView) vi.findViewById(R.id.imageView1); 
     ImageView retweeterimage = (ImageView) vi 
       .findViewById(R.id.retweeter_avatar); 
     ImageView replyImage = (ImageView) vi.findViewById(R.id.mentionbutton); 
     ImageView retweetImage = (ImageView) vi.findViewById(R.id.retweetbutton); 

     RelativeLayout profileImageLayout = (RelativeLayout) vi.findViewById(R.id.profileimagelayout); 

     profileImageLayout.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       Context context = v.getContext(); 
       Intent intent=new Intent(context, FriendProfileActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.putExtra("theuserid", rTiD); 
       intent.putExtra("totaltweets", rTtotalTweets); 
       intent.putExtra("totalfollowers", rTtotalFollowers); 
       intent.putExtra("totalfollowing", rTtotalFollowing); 
       intent.putExtra("useravatar", theRetweetedImgUrl); 
       intent.putExtra("username", theRetweetedUser); 
       intent.putExtra("screenname", theRetweetedScreenName); 
       intent.putExtra("tweetid", rtTweetId); 

       context.startActivity(intent); 
      } 
     }); 

     image.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       Context context = v.getContext(); 
       Intent intent=new Intent(context, LightboxActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

       intent.putExtra("thetweet", theRetweetedTxt); 
       intent.putExtra("theimage", url); 
       intent.putExtra("theuserid", rTiD); 
       intent.putExtra("screenname", theRetweetedScreenName); 
       intent.putExtra("tweetid", rtTweetId); 


       context.startActivity(intent); 
      } 
     }); 

     replyImage.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       Context context = v.getContext(); 
       Intent intent=new Intent(context, TweetScreenActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.putExtra("theuserid", rTiD); 
       intent.putExtra("screenname", theRetweetedScreenName); 
       intent.putExtra("tweetid", rtTweetId); 
       intent.putExtra("isretweet", false); 

       context.startActivity(intent); 
      } 
     }); 

     retweetImage.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) {     
       Context context = v.getContext(); 
       Intent intent=new Intent(context, TweetScreenActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.putExtra("theuserid", rTiD); 
       intent.putExtra("screenname", theRetweetedScreenName); 
       intent.putExtra("tweetid", rtTweetId); 
       intent.putExtra("isretweet", true); 
       intent.putExtra("thetweet", theRetweetedTxt); 

       context.startActivity(intent); 
      } 
     }); 

     String str = (String) DateUtils.getRelativeTimeSpanString(theTime.getTime(), currentDate.getTime(), 
       0L, DateUtils.FORMAT_ABBREV_ALL); 

     theTimeTv.setText(str); 
     theTweet.setText(theRetweetedTxt); 
     username.setText("RT by @" + theScreenName); 
     realname.setText("@" + theRetweetedScreenName); 

     imageLoader.DisplayImage(theRetweetedImgUrl, aviimage); 
     imageLoader.DisplayImage(url, image); 
     imageLoader.DisplayImage(aviUrl, retweeterimage); 
     return vi; 
    } else { 
     TextView theTweet = (TextView) vi.findViewById(R.id.tweet_text); 
     TextView username = (TextView) vi.findViewById(R.id.username); 
     TextView realname = (TextView) vi.findViewById(R.id.realname); 
     TextView theTimeTv = (TextView) vi.findViewById(R.id.theTime); 

     ImageView aviimage = (ImageView) vi.findViewById(R.id.user_avatar); 
     ImageView image = (ImageView) vi.findViewById(R.id.imageView1); 
     ImageView replyImage = (ImageView) vi.findViewById(R.id.mentionbutton); 
     ImageView retweetImage = (ImageView) vi.findViewById(R.id.retweetbutton); 

     RelativeLayout profileImageLayout = (RelativeLayout) vi.findViewById(R.id.profileimagelayout); 

     profileImageLayout.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       Context context = v.getContext(); 
       Intent intent=new Intent(context, FriendProfileActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.putExtra("theuserid", iD); 
       intent.putExtra("totaltweets", totalTweets); 
       intent.putExtra("totalfollowers", totalFollowers); 
       intent.putExtra("totalfollowing", totalFollowing); 
       intent.putExtra("useravatar", aviUrl); 
       intent.putExtra("username", theRealName); 
       intent.putExtra("screenname", theScreenName); 
       intent.putExtra("tweetid", tweetId); 

       context.startActivity(intent); 
      } 
     }); 

     image.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       Context context = v.getContext(); 
       Intent intent=new Intent(context, LightboxActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

       intent.putExtra("thetweet", theTweetText); 
       intent.putExtra("theimage", url); 
       intent.putExtra("theuserid", iD); 
       intent.putExtra("screenname", theScreenName); 
       intent.putExtra("tweetid", tweetId); 


       context.startActivity(intent); 
      } 
     }); 

     replyImage.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       Context context = v.getContext(); 
       Intent intent=new Intent(context, TweetScreenActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.putExtra("theuserid", iD); 
       intent.putExtra("screenname", theScreenName); 
       intent.putExtra("tweetid", tweetId); 
       intent.putExtra("isretweet", false); 


       context.startActivity(intent); 
      } 
     }); 

     retweetImage.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) {     
       Context context = v.getContext(); 
       Intent intent=new Intent(context, TweetScreenActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.putExtra("theuserid", iD); 
       intent.putExtra("screenname", theScreenName); 
       intent.putExtra("tweetid", tweetId); 
       intent.putExtra("isretweet", true); 
       intent.putExtra("thetweet", theTweetText); 

       context.startActivity(intent); 
      } 
     }); 

     ImageView retweeterimage = (ImageView) vi 
       .findViewById(R.id.retweeter_avatar); 
     retweeterimage.setImageBitmap(null); 

     String str = (String) DateUtils.getRelativeTimeSpanString(theTime.getTime(), currentDate.getTime(), 
       0L, DateUtils.FORMAT_ABBREV_ALL); 

     theTimeTv.setText(str); 
     theTweet.setText(theTweetText); 
     username.setText(theRealName); 
     realname.setText("@" + theScreenName); 

     imageLoader.DisplayImage(aviUrl, aviimage); 
     imageLoader.DisplayImage(url, image); 
     return vi; 
    } 

} 
+2

我不認爲最終變量會導致任何問題。它們與實例變量相同。我猜猜別的事會出錯。 – kosa 2012-07-16 19:05:14

+3

請在應用程序崩潰時在4.0+設備上發佈logcat。 – Sam 2012-07-16 19:05:54

+0

我也叫最終變量導致問題shenanigans。當您發佈有關Android應用程序崩潰的信息時,請發佈logcat。 – 2012-07-16 19:06:20

回答

3

「最終」關鍵字不會影響任何東西,它基本上只是告訴該值不會改變JVM,所以你的問題不在於此。