显示图像的片段中的内存问题

2024-04-02

我正在使用片段来显示图像/页面。我有一个活动(主要),其中包含所有片段。

package com.example.hscroll.demo;

import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.ListFragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import com.crittercism.app.Crittercism;
import com.example.hscroll.customer.BitmapWeakReference;
import com.example.hscroll.customer.PromotionalPriceListAdditionsDataAdaptor;
import com.example.hscroll.customer.PromotionalPriceListDataAdaptor;
import com.example.hscroll.library.imagezoom.ImageViewTouch;

public class MainAct extends FragmentActivity{

private ImageViewTouch  mImageView;
MyPagerAdapter mPagerAdapter;
ViewPager viewPager;
 static final int NUM_ITEMS = 58;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState); 
    Crittercism.init(getApplicationContext(), "4f391d0fb09315319d00048d");
    PreferenceManager.setDefaultValues(this, R.xml.preference, false);

    setContentView(R.layout.viewpager_layout);

    mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());

    viewPager = (ViewPager)findViewById(R.id.viewpager);
    viewPager.setAdapter(mPagerAdapter);
}


public static class MyPagerAdapter extends FragmentStatePagerAdapter {
    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    @Override
    public Fragment getItem(int position) {
            return newInstance(position);
    }


}

static Fragment newInstance(int position) {

    Fragment data = null;
    switch(position){

    case 0 :
        data = new Fragment1();
    break;

    case 1 :
        data = new FragmentSignupForm();
    break;

    case 2 :
        data = new Fragment2();
    break;

    case 3 :
        data = new Fragment3();
    break;

    case 4 :
        data = new Fragment4();
    break;

    case 5:
        data = new Fragment5();
    break;

    case 6 :
        data = new Fragment6();
    break;

    case 7 :
        data = new Fragment7();
    break;

    case 8 :
        data = new Fragment8();
    break;

    case 9 :
        data = new Fragment9();
    break;

    case 10 :
        data = new MyMapFragment();
    break;

    case 11:
        data = new FragmentQuestionaire();
        break;

    case 12:
        data = new Fragment10();
        break;

    case 13:
        data = new Fragment11();
        break;

    case 14:
        data = new Fragment12();
        break;

    case 15:
        data = new Fragment13();
        break;

    case 16:
        data = new Fragment14();
        break;

    case 17:
        data = new Fragment15();
        break;

    case 18:
        data = new Fragment16();
        break;

    case 19:
        data = new Fragment17();
        break;

    case 20:
        data = new Fragment18();
        break;

    case 21:
        data = new Fragment19();
        break;

    case 22:
        data = new Fragment20();
        break;

    case 23:
        data = new Fragment21();
        break;

    case 24:
        data = new Fragment22();
        break;

    case 25:
        data = new Fragment23();
        break;

    case 26:
        data = new Fragment24();
        break;

    case 27:
        data = new Fragment25();
        break;

    case 28:
        data = new Fragment26();
        break;

    case 29:
        data = new Fragment27();
        break;

    case 30:
        data = new Fragment28();
        break;

    case 31:
        data = new Fragment29();
        break;

    case 32:
        data = new Fragment30();
        break;

    case 33:
        data = new Fragment31();
        break;

    case 34:
        data = new Fragment32();
        break;

    case 35:
        data = new Fragment33();
        break;

    case 36:
        data = new Fragment34();
        break;

    case 37:
        data = new Fragment35();
        break;

    case 38:
        data = new Fragment36();
        break;

    case 39:
        data = new Fragment37();
        break;

    case 40:
        data = new Fragment38();
        break;

    case 41:
        data = new Fragment39();
        break;

    case 42:
        data = new Fragment40();
        break;

    case 43:
        data = new Fragment41();
        break;

    case 44:
        data = new Fragment42();
        break;

    case 45:
        data = new Fragment43();
        break;

    case 46:
        data = new Fragment44();
        break;

    case 47:
        data = new Fragment45();
        break;

    case 48:
        data = new Fragment46();
        break;

    case 49:
        data = new Fragment47();
        break;

    case 50:
        data = new Fragment48();
        break;

    case 51:
        data = new Fragment49();
        break;

    case 52:
        data = new Fragment50();
        break;

    case 53:
        data = new Fragment51();
        break;

    case 54:
        data = new Fragment52();
        break;

    case 55:
        data = new Fragment53();
        break;

    case 56:
        data = new Fragment54();
        break;

    case 57:
        data = new Fragment55();
        break;

    default :
        data = new FragmentQuestionaire();
    break;  

    }

        return data;
}

@Override
protected void onDestroy() {
    super.onDestroy();
    FragmentSignupForm.CUSTOMER_ADDRESS = "";
    FragmentSignupForm.CUSTOMER_ADDRESS1 = "";
    FragmentSignupForm.CUSTOMER_ADDRESS2 = "";
    FragmentSignupForm.CUSTOMER_EMAIL = "";
    FragmentSignupForm.CUSTOMER_ID = "";
    FragmentSignupForm.CUSTOMER_POSTCODE = "";
    FragmentSignupForm.CUSTOMER_NAME = "";
    FragmentSignupForm.Telephone = "";
    Fragment50.Total = "0";
    Fragment47.amount2 = 0;
    Fragment47.systemSize = "";
    PromotionalPriceListAdditionsDataAdaptor.TotalAdditionalPrice = 0;
    PromotionalPriceListDataAdaptor.TotalPrice = 0;
    PromotionalPriceListDataAdaptor.Capacity = "";
    PromotionalPriceListDataAdaptor.NumberOfPanels = "";
    PromotionalPriceListDataAdaptor.PanelSize = "";
    PromotionalPriceListDataAdaptor.PanelCapacity = "";
    PromotionalPriceListDataAdaptor.SurfaceAreaReuired = "";
    PromotionalPriceListDataAdaptor.Price = "";
    PromotionalPriceListDataAdaptor.PromotionalOffer = "";
    PromotionalPriceListDataAdaptor.TotalOfferPrice = "";
   }

   }

这是片段类中的代码 -

package com.example.hscroll.demo;

import java.io.BufferedInputStream;
import java.io.FileInputStream;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import com.example.hscroll.customer.BitmapWeakReference;
 import com.example.hscroll.library.imagezoom.ImageViewTouch;

public class Fragment2 extends Fragment{

ImageViewTouch imgview ;
LayoutInflater inflater;
FileInputStream in;
BufferedInputStream buf;
BitmapWeakReference bitmap;
ViewGroup con;

private final String  PATH = "/mnt/sdcard/Ideal Solar/Layout_1.png";

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance)
{
    this.inflater = inflater;
    if(container == null)return null;
    container = (LinearLayout)inflater.inflate(R.layout.fragment0_layout, container, false);
    con = container;
    imgview= (ImageViewTouch)container.findViewById(R.id.imageView1);
    bitmap = new BitmapWeakReference(imgview.selectImage(inflater.getContext(), PATH));
    if(bitmap!=null)
        imgview.setImageBitmapReset( bitmap.get(), true );

    return container;
}   

/* @Override
    public void onResume() {

        if(bitmap == null)
        {
            bitmap = SelectImageFunctions.selectImage(inflater.getContext(), PATH);
        }
        super.onResume();
    }*/

 @Override
public void onDestroyView() {
     super.onDestroyView();
        imgview.setImageBitmap(null);
        bitmap.clear();
        bitmap = null;
        Fragment1.unbindDrawables(con.findViewById(R.id.ll));
        System.gc();
    }

   }

每次当我移动到下一个片段时,前一个片段的 onDestroyView() 都会被调用,并且我正在删除位图和图像视图的所有引用,但位图或可绘制对象的内存仍然没有被释放,并且内存不断增加。最后它崩溃了大约50MB。

有人可以帮忙吗?我正在为 Galaxy Tab 开发这个应用程序。

更新 - 动态页面代码 -

 package com.example.hscroll.demo;


   import java.io.BufferedReader;
   import java.io.IOException;
   import java.io.InputStream;
   import java.io.InputStreamReader;
   import java.util.ArrayList;

   import org.apache.http.HttpEntity;
   import org.apache.http.HttpResponse;
   import org.apache.http.NameValuePair;
   import org.apache.http.client.HttpClient;
   import org.apache.http.client.entity.UrlEncodedFormEntity;
   import org.apache.http.client.methods.HttpPost;
   import org.apache.http.impl.client.DefaultHttpClient;
   import org.apache.http.message.BasicNameValuePair;
   import org.json.JSONArray;
   import org.json.JSONObject;

   import android.content.Context;
   import android.os.AsyncTask;
   import android.os.Bundle;
   import android.support.v4.app.Fragment;
   import android.view.LayoutInflater;
   import android.view.View;
   import android.view.ViewGroup;
   import android.view.inputmethod.InputMethodManager;
   import android.widget.Button;
   import android.widget.EditText;
   import android.widget.LinearLayout;
   import android.widget.ScrollView;
   import android.widget.Toast;


   public class FragmentSignupForm extends Fragment {

LayoutInflater inflater;
String result = null;
InputStream is = null;
StringBuilder sb = null;
JSONArray jArray;
EditText c_nameText;
EditText c_addressText;
EditText c_postcodeText;
EditText c_emailText;
EditText s_nameText;
EditText c_addressLine2Text;
EditText telephone_Text;
public static String CUSTOMER_NAME = "";
public static String CUSTOMER_ADDRESS = "";
public static String CUSTOMER_ADDRESS1 = "";
public static String CUSTOMER_ADDRESS2 = "";
public static String CUSTOMER_POSTCODE = "";
public static String CUSTOMER_ID;
public static String CUSTOMER_EMAIL = "";
public static String SALES_CONTACT = "";
public static String Telephone = "";

String output = null;

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
ViewGroup con;


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance)
{
    this.inflater = inflater;
    if(container == null)return null;
    container = (ScrollView)inflater.inflate(R.layout.signup_form_layout, container, false);
    con = container;
    ScrollView sv = (ScrollView)container.findViewById(R.id.SV);
    sv.setBackgroundDrawable(AssestUtil.getBitmapFromAsset(inflater.getContext(), "bg.jpg"));

    LinearLayout ll = (LinearLayout)container.findViewById(R.id.ll);
    ll.setBackgroundDrawable(AssestUtil.getBitmapFromAsset(inflater.getContext(), "formbg2.png"));

    c_nameText = (EditText)container.findViewById(R.id.cust_name);
    c_nameText.setText(CUSTOMER_NAME);
    c_addressText = (EditText)container.findViewById(R.id.cust_address);
    c_addressText.setText(CUSTOMER_ADDRESS1);
    c_addressLine2Text = (EditText)container.findViewById(R.id.cust_Address2);
    c_addressLine2Text.setText(CUSTOMER_ADDRESS2);
    c_postcodeText = (EditText)container.findViewById(R.id.postcode);
    c_postcodeText.setText(CUSTOMER_POSTCODE);
    c_emailText = (EditText)container.findViewById(R.id.cust_email);
    c_emailText.setText(CUSTOMER_EMAIL);
    s_nameText = (EditText)container.findViewById(R.id.sales_name);
    s_nameText.setText(SALES_CONTACT);
    telephone_Text = (EditText)container.findViewById(R.id.telephone);
    telephone_Text.setText(Telephone);             

        Button save = (Button)container.findViewById(R.id.save_btn);
        Button Reset = (Button)container.findViewById(R.id.reset_btn);
        final Context context = inflater.getContext();
          //Send form data to server on click action
       save.setOnClickListener(new View.OnClickListener()
       {

            public void onClick(View v) {

                CUSTOMER_NAME = c_nameText.getText().toString();
                System.out.println(CUSTOMER_NAME);
                CUSTOMER_ADDRESS = c_addressText.getText().toString() + ","+ c_addressLine2Text.getText().toString()+","+c_postcodeText.getText().toString();;
                CUSTOMER_POSTCODE = c_postcodeText.getText().toString();
                Telephone = telephone_Text.getText().toString();

                new SendDataToServer().execute(c_nameText.getText().toString(),c_addressText.getText().toString(),c_addressLine2Text.getText().toString(),c_postcodeText.getText().toString(),c_emailText.getText().toString(),s_nameText.getText().toString(),telephone_Text.getText().toString());
                InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
              imm.hideSoftInputFromWindow(s_nameText.getWindowToken(), 0);
            }
       });

     Reset.setOnClickListener(new View.OnClickListener()
       {

            public void onClick(View v) {

                c_nameText.setText(""); 
                c_addressText.setText("");
                c_addressLine2Text.setText("");
                c_postcodeText.setText("");
                c_emailText.setText("");
                s_nameText.setText("");
                telephone_Text.setText("");
            }
       });

    return container;
}

private class SendDataToServer extends AsyncTask<String, Void, String>
{

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

        try
        {                   
        nameValuePairs.add(new BasicNameValuePair("cust_name",params[0]));
        nameValuePairs.add(new BasicNameValuePair("cust_address",params[1]+","+params[2]));
        nameValuePairs.add(new BasicNameValuePair("cust_postcode",params[3]));
        nameValuePairs.add(new BasicNameValuePair("cust_email",params[4]));
        nameValuePairs.add(new BasicNameValuePair("sales_name",params[5]));
        nameValuePairs.add(new BasicNameValuePair("pvgis_data", params[6]));    

             HttpClient httpclient = new DefaultHttpClient();
              HttpPost httppost = new HttpPost("http://ideal.contrastgroup.info/idealsolar/initializeCustomer.php");
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();

                JSONObject myAway = new JSONObject(read(is));
                CUSTOMER_ID = myAway.getString("custID");
                output = myAway.getString("message");


        }
        catch(Exception e)
        {
            output = "null";

        }
        return output;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if(result.equalsIgnoreCase("success"))
        {
        Toast.makeText(inflater.getContext(), "Database updated", Toast.LENGTH_SHORT).show();
        }
        else
        {
            Toast.makeText(inflater.getContext(), "Error in Connection", Toast.LENGTH_SHORT).show();
        }
    }

}

public static String read(InputStream in) throws IOException {
    StringBuilder sb = new StringBuilder();
    BufferedReader r = new BufferedReader(new InputStreamReader(in));

    for (String line = r.readLine(); line != null; line = r.readLine()) {
        sb.append(line);
    }

    in.close();
    System.out.println(sb.toString());
    return sb.toString();
}


@Override
public void onDestroyView() {
    super.onDestroyView();

    Fragment1.unbindDrawables(con.findViewById(R.id.SV));
    System.gc();
}

}

     public static void unbindDrawables(View view) {
        if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
        ((ViewGroup) view).removeAllViews();
        }

来自谷歌:

片段状态寻呼机支持 演示如何使用支持类 ViewPager 和 FragmentStatePagerAdapter 来构建用户界面,用户可以在其中 向左或向右滑动可在片段之间切换。这个版本的 适配器不保留 ViewPager 拥有的片段实例 被毁了。

http://developer.android.com/resources/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStatePagerSupport.html http://developer.android.com/resources/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStatePagerSupport.html

与普通分页器的区别在于它扩展了 FragmentStatePagerAdapter。

编辑: 在谷歌代码中,您在适配器中有这样的内容:

public static class MyAdapter extends FragmentStatePagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    @Override
    public Fragment getItem(int position) {
        return ArrayListFragment.newInstance(position);
    }
}

注意 getItem() 的实现。我们根据需要获取新的片段,因此我们不会在需要之前创建片段。这与您创建所有片段并将它们添加到向量的方法形成鲜明对比。 (顺便说一句,java更喜欢数组列表。)通过您的方法,片段不会从内存中删除,因为总会有对片段的引用。

编辑2: 再具体一点。如下:

@Override
public Fragment getItem(int position) {
    return ArrayListFragment.newInstance(position);
}

你可以这样做:

    @Override
    public Fragment getItem(int position) {
if(position == 1) {
return Fragment1.newInstance(position);
} else {
return Fragment2.newInstance(position);
}

    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

显示图像的片段中的内存问题 的相关文章

  • 未找到 ADB screenrecord 命令

    我无法奔跑adb shell screenrecord sdcard my mp4 我尝试运行此命令的设备规格 Honor 5C 安卓6 0 每当我运行 screenrecord 命令时 它都会显示未找到命令 D adb gt adb sh
  • 如何在 PercentRelativeLayout 中使用layout_aspectRatio?

    我尝试在视图上实现 16 9 的纵横比PercentRelativeLayout https developer android com reference android support percent PercentRelativeLa
  • phonestateintentreceiver.notifyPhoneCallState 的用途是什么?

    谁能告诉我有什么用phonestateintentreceiver notifyPhoneCallState 我知道现在在这里发布答案为时已晚 可能对将来参考此问题的人有所帮助 如果您的应用程序希望收到有关来电的通知 则必须调用notify
  • 如何在android中使用Mediaprojection库捕获屏幕并转换为mp4文件?

    从 android 5 0 开始 他们提供了媒体投影库来捕获屏幕内容 但他们提供的示例演示应用程序尚不清楚 你可以找到示例应用程序here https github com googlesamples android ScreenCaptu
  • 我的手机设备上的 adb shell:出现奇怪的字符(终端颜色问题)

    我有一台配备 DarkyRom 10 4 2 XWJW1 Android 2 3 6 和 root 访问权限的 Samsung Galaxy S 我正在实现一个应用程序 我想使用 eclipse 在手机中执行它 但出现错误 Activity
  • Android 4.3 虚拟设备 CPU/ABI - 未安装系统映像(eclipse)

    I m trying to set up a new device but I can not continue with the process I think it s because the target version is 4 3
  • 如何在Android Studio中安装android 6.0.1模拟器?

    我在我的 Android 模拟器上遇到这个问题E Surface getSlotFromBufferLocked 未知缓冲区 0xab7519c0 https stackoverflow com questions 33046375 e s
  • Android:Google Maps API 密钥注册:MD5 认证密钥

    如何获取MD5指纹密钥 我正在使用这个命令 C Program Files Java jdk1 7 0 04 bin gt keytool exe list alias androiddebugkey keystore C Document
  • 如何避免内存不足异常

    在我的应用程序中 我使用图像的 url 从网络下载图像 我有很多图像 因此我为此实现了分页技术 并按垂直顺序为每页显示 15 个图像 在这种情况下 我向上 向下滚动页面以查看图像 此时我的应用程序崩溃了 并且出现了内存不足异常 请任何人帮助
  • Buildozer Numpy RuntimeError:工具链损坏:无法链接简单的 C 程序

    用 Python 编写我的第一个 Android 应用程序并使用 Buildozer 对其进行打包 因为稍后在项目中需要使用numpy 所以我尝试打包以下测试代码 import numpy import kivy kivy require
  • Android Studio 3.0 - 设置未保存

    我已将 文件 gt 设置 gt 编辑器 gt 代码样式 中的 右边距 列 从默认的 100 增加到 140 不幸的是 每次重新启动 Android Studio 后 该边距都会重置 我还尝试导出和导入我的设置 但这并不能阻止重置右边距 希望
  • 重构 google 的 NetworkBoundResource 类以使用 RxJava 而不是 LiveData

    谷歌的android架构组件教程here https developer android com topic libraries architecture guide html有一部分解释了如何抽象通过网络获取数据的逻辑 在其中 他们使用
  • android中ScrollView中的图像

    在我的应用程序中 我想放置一个 png 文件 并且希望它在横向和纵向模式下都被视为滚动图像 请建议代码或示例 要使您的 Imageview 在高度不适合时滚动 您可以在 xml 中的 ScrollView 内添加一个 ImageView 并
  • 上传失败您应该使用 http 和 https 作为您的 Web 意图过滤器的方案

    上传失败 您应该使用 http 和 https 作为您的 Web 意图过滤器的方案 我在将免安装应用上传到 Play 商店时收到此错误 我在清单中声明了 http 和 https 的意图过滤器 如下所示
  • 以编程方式安装 Android apk 作为测试框架的一部分

    我正在尝试以编程方式安装 apk 但运气不佳 我正在设置一个针对物理设备的自动化测试框架 并且我希望测试设备在运行测试之前从构建服务器检索最新的 apk 虽然我知道没有通用的方法可以在未经用户同意的情况下实际安装 apk 但我很好奇在开发人
  • 设置 LinearLayout 的最大宽度

    如何设置水平线的最大宽度LinearLayout 因此 如果内容较短 例如某些文本 布局会缩小 如果内容较长 则布局不会扩展超过某个最大宽度值 我更喜欢在 XML 级别执行此操作 这就是我所需要的超出了之前答案中的建议 https stac
  • Android 预安装检测

    我的 Android 应用程序将被预安装 我想继续跟踪预安装的应用程序 为此 我需要以某种方式保存密钥或标志 这意味着该应用程序是预安装的 我会将此密钥添加到后端的每个请求中并对其进行分析 我对此有疑问 有一个问题是关于从 Google P
  • Android JobScheduler 每天只运行一次

    我检查了 JobScheduler API 它可以从 Android API 级别 21 开始使用 我想安排一个需要互联网并且每天仅运行一次或可选每周运行一次的任务 如果成功执行 我没有找到关于这种情况的例子 有人能帮我吗 谢谢 针对您的问
  • 膨胀类 android.support.design.internal.BottomNavigationView 时出错

    我正在制作我的第一个应用程序 这是一个简单的应用程序 带有启动屏幕和主要活动 现在我有两个构建变体 免费版本 活动底部有 Admob 横幅 付费版本 该应用程序不会在底部显示 admob 横幅 而是将其替换为用于切换活动的底部导航视图 我将
  • 智能手机可以通过 3G/4G 进行点对点通信吗?

    我正在尝试编写一个应用程序 将数据从一个 Android 设备传输到另一个 Android 设备 但这些设备很可能位于城市 州或国家的不同部分 直接的方法是拥有一台中央服务器 或任何类型的服务器 但我试图避免使用中央服务器 我试图传递的数据

随机推荐