Android系统。内存泄漏导致内存不足错误。使用View Pager。

时间:2014-10-31 00:02:22

标签: android android-fragments memory-leaks android-viewpager out-of-memory

我从以下代码中获取内存泄漏。它是一个包含mainViewPager的活动。该viewPager返回4个不同的片段,每个片段都有自己的ViewPagers,用于保存从同一个asyncTask中检索的图像。这是我的代码。当我运行它时,我可以滚动浏览页面有一些滞后。但当我退出返回活动时,我得到一个内存不足错误。所以它必须是内存泄漏。我永远盯着我的代码,我无法弄清楚原因。请帮帮我... PS。我正在使用Picasso库从服务器获取图像。

活动

package info.nightowl.nightowl;

import info.nightowl.nightowl.LocationsGridFragment.onLocationSelectedListener;

public class NightWatch extends FragmentActivity implements onLocationSelectedListener {

public static ArrayList<String> imageUrl = new ArrayList<String>();
public static ArrayList<String> dateList = new ArrayList<String>();
public static ArrayList<String> trendList = new ArrayList<String>();
public static ArrayList<String> nameList = new ArrayList<String>();
public static ArrayList<String> imageLocationsList = new ArrayList<String>();
public static ArrayList<String> imageClubsList = new ArrayList<String>();

public static ArrayList<String> locationsList = new ArrayList<String>();
public static ArrayList<String> clubsList = new ArrayList<String>();
public static ArrayList<String> locationImagesUrl = new ArrayList<String>();
public static ArrayList<String> addressList = new ArrayList<String>();

public static ArrayList<String> hotImageUrl = new ArrayList<String>();
public static ArrayList<String> hotDateList = new ArrayList<String>();
public static ArrayList<String> hotTrendList = new ArrayList<String>();
public static ArrayList<String> hotNameList = new ArrayList<String>();
public static ArrayList<String> hotImageLocationsList = new ArrayList<String>();
public static ArrayList<String> hotImageClubsList = new ArrayList<String>();

FetchClubs fetchClubs = null;

public int width, height;
public JSONArray list;
public final String IMAGE_URL = "http://www.night-owl.info/webservice/";
SharedPreferences prefs;
static FeedFragment feedFragment;
static LocationsFragment locationsFragment;
static HotFragment hotFragment;
static ClubsFragment clubsFragment;
CustomViewPager customPager;
CustomViewPageAdapter theAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_night_watch);

    //Method to set up the tabs
    getSizes();
    setupFragments();
    updateList();

    prefs = getSharedPreferences("prefs", 0);
}

//Called from the fragment which fetches image
public void loadBitmap(String image, ImageView imageView, boolean grid, TextView loadText) {

    int size;
    if (grid) size = (width-width/9)/3;
    else size = width - width/9;
    Log.d("Pager About to load", "Pager Loading bitmap picasso");

    getBitmap load = new getBitmap(image, imageView, size, loadText);
    load.execute(image);

}

public class getBitmap extends AsyncTask<String, Void, Bitmap> {
    String loadImageUrl;
    Bitmap bmp;
    int sizes;
    TextView loadingTextView;
    private final WeakReference<ImageView> imageViewReference;

    public getBitmap(String image, ImageView imageView, int size, TextView loadText){

        imageViewReference = new WeakReference<ImageView>(imageView);
        sizes = size;
        loadingTextView = loadText;
    }

    @Override
    protected void onPreExecute() {
        Log.d("async", "async starting");
        super.onPreExecute();
    }

    @Override
    protected Bitmap doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        try {
            bmp = Picasso.with(NightWatch.this).load(IMAGE_URL+arg0[0]).resize(sizes, 
sizes).get();

        } catch (IOException e) {
            Log.d("ioexc", "Pager IOEXCEPTION IDIOT!!!");
            e.printStackTrace();
        }
        return bmp;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        /*RoundedCornersDrawable drawable = new RoundedCornersDrawable(getResources(), bmp);
        loadImage.setImageDrawable(drawable);
        loadingTextView.setVisibility(View.GONE);
        loadImage.setVisibility(View.VISIBLE);*/

        if(imageViewReference != null && bitmap!= null) {
            final ImageView imageView = imageViewReference.get();
            if(imageView != null) {
                imageView.setImageBitmap(bitmap);
                loadingTextView.setVisibility(View.GONE);
                imageView.setVisibility(View.VISIBLE);
            }
        }

    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.feed, menu);
    return true;
}

//SET UP THE TWO TABS 'FEED' AND 'LOCATIONS'

//Update ArrayList of the image names
public void updateList() {
    imageUrl.clear();
    trendList.clear();
    dateList.clear();
    nameList.clear();
    imageLocationsList.clear();
    imageClubsList.clear();

    locationsList.clear();
    clubsList.clear();
    locationImagesUrl.clear();
    addressList.clear();

    hotImageUrl.clear();
    hotTrendList.clear();
    hotDateList.clear();
    hotNameList.clear();
    hotImageLocationsList.clear();
    hotImageClubsList.clear();

    new getImageUrl().execute();
    new getLocationsUrl().execute();
}

class getImageUrl extends AsyncTask<String, String, String> {

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

        JSONParser parser = new JSONParser();
        JSONObject json = parser.getJSONFromUrl(IMAGE_URL + "updateimages.php");

        try {

            list = json.getJSONArray("posts");

            for(int i = 0; i < list.length(); i++) {
                JSONObject c = list.getJSONObject(i);
                String imgSrc = c.getString("source");
                String trend = c.getString("trend");
                String date = c.getString("date");
                String name = c.getString("name");
                String location = c.getString("location");
                String club = c.getString("club");

                imageUrl.add(imgSrc);
                dateList.add(date);
                trendList.add(trend);
                nameList.add(name);
                imageLocationsList.add(location);
                imageClubsList.add(club);

                Log.d("async trend", trendList.get(0));
            }

            Log.d("Got list", imageUrl.get(0) + " " + trendList.get(0));

        } catch(JSONException je) {
            je.printStackTrace();   
        }

        try {

            list = json.getJSONArray("hot");

            for(int i = 0; i < list.length(); i++) {
                JSONObject c = list.getJSONObject(i);
                String imgSrc = c.getString("source");
                String trend = c.getString("trend");
                String date = c.getString("date");
                String name = c.getString("name");
                String location = c.getString("location");
                String club = c.getString("club");

                hotImageUrl.add(imgSrc);
                hotDateList.add(date);
                hotTrendList.add(trend);
                hotNameList.add(name);
                hotImageLocationsList.add(location);
                hotImageClubsList.add(club);
                Log.d("async trend", trendList.get(0));
            }

            Log.d("Got list","hot list" + hotImageUrl.get(0) + " " + hotTrendList.get(0));

        } catch(JSONException je) {
            je.printStackTrace();   
        }

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        hotFragment.updateAdapter();
        feedFragment.updateAdapter();

    }
}

public void scrollMainPager(int pos) {
    customPager.setCurrentItem(pos, true);
}

public void scrollPager(int pos) {
    feedFragment.scrollPager(pos);
}

public void setupFragments() {

    feedFragment = new FeedFragment();
    locationsFragment = new LocationsFragment();
    hotFragment = new HotFragment();
    clubsFragment = new ClubsFragment();

    customPager = (CustomViewPager) findViewById(R.id.customviewpager);
    customPager.setOffscreenPageLimit(3);
    theAdapter = new CustomViewPageAdapter(getSupportFragmentManager());
    customPager.setAdapter(theAdapter);
    customPager.setCurrentItem(1);
}


//GET SIZES OF SCREEN
public void getSizes(){
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    height = size.y;
}


public static class CustomViewPageAdapter extends FragmentStatePagerAdapter {

    public CustomViewPageAdapter(FragmentManager fm) {
        super(fm);

    }

    @Override
    public Fragment getItem(int arg0) {

        if(arg0 == 0) return hotFragment;
        else if(arg0 == 1) return feedFragment;
        else if(arg0 == 2) return locationsFragment;
        else if(arg0 == 3) return clubsFragment;

        return null;

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 4;
    }

}

@Override
public void onLocationSelected(int position) {




}

}

FeedFragment

public class FeedFragment extends Fragment implements OnClickListener {

ToggleButton buttonGrid;
static Spinner spinnerUploadStatus;
CustomEditText et;
CustomScrollTextView tv;
int width, height;
View view;
static boolean isGrid;
ViewPager mPager;
SharedPreferences prefs;
public ImagePagerAdapter mPageAdapter;
Button buttonSwitchFragment;

Integer[] b = { R.drawable.statusunpressed, R.drawable.red,
        R.drawable.green, R.drawable.blue };

List<Integer> spinnerList = new ArrayList<Integer>(Arrays.asList(b));
CustomSpinnerAdapter myAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {

    prefs = getActivity().getSharedPreferences("prefs", 0);
    getSizes();
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.activity_feed, container, false);

    setup();

    return view;
}

@SuppressLint("NewApi")
public void setup() {

    isGrid = false;

    mPager = (ViewPager) view.findViewById(R.id.myviewpager1);
    mPager.setOffscreenPageLimit(0);

    buttonGrid = (ToggleButton) view.findViewById(R.id.button_grid);
    buttonGrid.setOnClickListener(this);

    spinnerUploadStatus = (Spinner) view
            .findViewById(R.id.buttonUploadStatus);

    myAdapter = new CustomSpinnerAdapter(getActivity(),
            R.layout.item_simple_list_item, spinnerList);
    myAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spinnerUploadStatus.setAdapter(myAdapter);
    spinnerUploadStatus.setDropDownWidth((int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, 50, getResources()
                    .getDisplayMetrics()));
    spinnerUploadStatus.setOnItemSelectedListener(myOnItemSelectedListener);
    spinnerUploadStatus.getBackground().setAlpha(0);

    buttonSwitchFragment = (Button) view
            .findViewById(R.id.buttonSwitchFragment);
    buttonSwitchFragment.setOnClickListener(this);

    Typeface font = Typeface.createFromAsset(getActivity().getAssets(),
            "NotCourierSans.ttf");
    et = (CustomEditText) view.findViewById(R.id.customEditText1);
    et.updateTypeFace(font);

    tv = (CustomScrollTextView) view
            .findViewById(R.id.customscrolltextview);
    tv.setText("WELCOME TO NIGHTOWL");
    tv.setTypeface(font);
    tv.start(width / 2500.0);

    Log.d("width", "width is " + width);
}

public void getSizes() {
    Display display = getActivity().getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    height = size.y;
}

@Override
public void onClick(View v) {

    switch (v.getId()) {

    case R.id.button_grid:

        isGrid = !isGrid;

        updateAdapter();
        break;
    case R.id.buttonSwitchFragment:
        ((NightWatch) getActivity()).scrollMainPager(2);
        break;

    }
}

public OnItemSelectedListener myOnItemSelectedListener = new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        int colour = arg2;

        spinnerUploadStatus.setSelection(0, true);
        et.sendText(prefs.getString("username", "username invalid"), colour);

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }

};

public void scrollPager(int position) {

    isGrid = false;
    buttonGrid.setChecked(false);
    updateAdapter();

    mPager.setCurrentItem(position, true);
    Log.d("Pager", "PAGER UPDATED");
}

public static void disableButton(Boolean enabled) {
    spinnerUploadStatus.setEnabled(enabled);
}

public void updateAdapter() {
    int theSize;
    if (!isGrid)
        theSize = NightWatch.imageUrl.size();

    else if (NightWatch.imageUrl.size() % 9 > 0)
        theSize = NightWatch.imageUrl.size() / 9 + 1;
    else
        theSize = NightWatch.imageUrl.size() / 9;

    mPageAdapter = new ImagePagerAdapter(getChildFragmentManager(), theSize);
    mPager.setAdapter(mPageAdapter);

    Log.d("size of viewPager Adapter", "" + theSize);
}

public static class ImagePagerAdapter extends FragmentStatePagerAdapter {

    int mSize;

    public ImagePagerAdapter(FragmentManager fm, int size) {
        super(fm);

        mSize = size;
    }

    @Override
    public Fragment getItem(int arg0) {
        // TODO Auto-generated method stub
        Log.d("Starting imageDetailFragment", "");
        Log.d("Pager", "Pager starting fragment");

        Log.d("GRID", "fuck grid");
        if (!isGrid)
            return ImageDetailFragment.newInstance(
                    arg0, NightWatch.imageUrl, NightWatch.nameList,
                    NightWatch.trendList, NightWatch.dateList);
        else
            return GridFragment.newInstance(arg0, NightWatch.imageUrl);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mSize;
    }
}

public class CustomSpinnerAdapter extends ArrayAdapter<Integer> {

    List<Integer> resourceId;
    Context c;

    public CustomSpinnerAdapter(Context context, int textViewResourceId,
            List<Integer> objects) {
        super(context, textViewResourceId, objects);

        resourceId = objects;
        c = context;

    }

    @Override
    public View getDropDownView(int position, View convertView,
            ViewGroup parent) {
        return getCustomDropdownView(position, convertView, parent);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }

    public View getCustomView(int position, View convertView,
            ViewGroup parent) {
        ImageView imageView = new ImageView(c);

        imageView.setImageResource(resourceId.get(position));
        imageView.setLayoutParams(new ListView.LayoutParams(
                (int) TypedValue.applyDimension(
                        TypedValue.COMPLEX_UNIT_DIP, 50, getResources()
                                .getDisplayMetrics()), (int) TypedValue
                        .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 34,
                                getResources().getDisplayMetrics())));

        return imageView;
    }

    public View getCustomDropdownView(int position, View convertView,
            ViewGroup parent) {
        ImageView imageView = new ImageView(c);

        imageView.setImageResource(resourceId.get(position));
        imageView.setLayoutParams(new ListView.LayoutParams(
                (int) TypedValue.applyDimension(
                        TypedValue.COMPLEX_UNIT_DIP, 50, getResources()
                                .getDisplayMetrics()), (int) TypedValue
                        .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 34,
                                getResources().getDisplayMetrics())));

        if (position == 0) {
            imageView.setVisibility(View.GONE);
        }

        return imageView;
    }

}

}

ImageDetailFragment

package info.nightowl.nightowl;

import java.io.IOException;
import java.util.ArrayList;

import com.example.nightowl.R;
import com.squareup.picasso.Picasso;

import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class ImageDetailFragment extends Fragment implements OnClickListener {

int mImageNum;
ImageView imageView;
TextView trendTextView;
TextView nameTextView;
TextView dateTextView;
TextView loadingTextView;
Button upVoteButton, downVoteButton;
final String list = "voteList";
static SharedPreferences prefs;
SharedPreferences.Editor editor;
public ArrayList<String> imageUrl;
public ArrayList<String> trendList;
public ArrayList<String> nameList;
public ArrayList<String> dateList;
RelativeLayout.LayoutParams rParams;

int width, height;

static ImageDetailFragment newInstance(int imageNum,
        ArrayList<String> imageList, ArrayList<String> tempNameList,
        ArrayList<String> tempTrendList, ArrayList<String> tempDateList) {

    final ImageDetailFragment f = new ImageDetailFragment();
    Bundle args = new Bundle();
    args.putInt("imageNum", imageNum);
    args.putStringArrayList("imageList", imageList);
    args.putStringArrayList("nameList", tempNameList);
    args.putStringArrayList("trendList", tempTrendList);
    args.putStringArrayList("dateList", tempDateList);
    f.setArguments(args);
    return f;
}

public ImageDetailFragment() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mImageNum = getArguments().getInt("imageNum");
        imageUrl = getArguments().getStringArrayList("imageList");
        nameList = getArguments().getStringArrayList("nameList");
        trendList = getArguments().getStringArrayList("trendList");
        dateList = getArguments().getStringArrayList("dateList");
    } else
        mImageNum = -1;
    prefs = getActivity().getSharedPreferences("prefs", 0);
    editor = getActivity().getSharedPreferences("prefs", 0).edit();
    getSizes();
    rParams = new RelativeLayout.LayoutParams((width - width/9), width - width/9);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    final View v = inflater.inflate(R.layout.image_detail_fragment,
            container, false);
    imageView = (ImageView) v.findViewById(R.id.imageView1);

    imageView.setVisibility(View.INVISIBLE);

    loadingTextView = (TextView) v.findViewById(R.id.loadingTextView);
    loadingTextView.setVisibility(View.VISIBLE);

    trendTextView = (TextView) v.findViewById(R.id.trendTextView);
    nameTextView = (TextView) v.findViewById(R.id.nameTextView);
    dateTextView = (TextView) v.findViewById(R.id.dateTextView);
    upVoteButton = (Button) v.findViewById(R.id.buttonUpVote);
    downVoteButton = (Button) v.findViewById(R.id.buttonDownVote);

    rParams.addRule(RelativeLayout.BELOW, nameTextView.getId());
    rParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
    imageView.setLayoutParams(rParams);

    upVoteButton.setOnClickListener(this);
    downVoteButton.setOnClickListener(this);

    if (NightWatch.class.isInstance(getActivity())) {

        Typeface font = Typeface.createFromAsset(getActivity().getAssets(),
                "NotCourierSans.ttf");

        final String image = imageUrl.get(mImageNum);
        ((NightWatch) getActivity()).loadBitmap(image, imageView, false, loadingTextView);
        trendTextView.setText(trendList.get(mImageNum));
        nameTextView.setText(nameList.get(mImageNum));
        dateTextView.setText(dateList.get(mImageNum));

        updateButtonBackgrounds();

        loadingTextView.setTypeface(font);
        trendTextView.setTypeface(font);
        nameTextView.setTypeface(font);
        dateTextView.setTypeface(font);
        Log.d("fragment trend", NightWatch.trendList.get(0));

    }

    return v;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

}

@Override
public void onClick(View v) {

    switch (v.getId()) {
    case R.id.buttonUpVote:

        if (prefs.getInt(imageUrl.get(mImageNum), 0) == -1) {
            downVoteButton
                    .setBackgroundResource(R.drawable.downvoteunpressed);
            upVoteButton.setBackgroundResource(R.drawable.upvotepressed);
            ((NightWatch) getActivity()).sendVote(1,
                    imageUrl.get(mImageNum));

        } else if (prefs.getInt(imageUrl.get(mImageNum), 0) == 0) {
            upVoteButton.setBackgroundResource(R.drawable.upvotepressed);
            ((NightWatch) getActivity()).sendVote(1,
                    imageUrl.get(mImageNum));
        }

        break;
    case R.id.buttonDownVote:

        if (prefs.getInt(imageUrl.get(mImageNum), 0) == 1) {
            downVoteButton
                    .setBackgroundResource(R.drawable.downvotepressed);
            upVoteButton.setBackgroundResource(R.drawable.upvoteunpressed);
            ((NightWatch) getActivity()).sendVote(-1,
                    imageUrl.get(mImageNum));

        } else if (prefs.getInt(imageUrl.get(mImageNum), 0) == 0) {
            downVoteButton
                    .setBackgroundResource(R.drawable.downvotepressed);
            ((NightWatch) getActivity()).sendVote(-1,
                    imageUrl.get(mImageNum));
        }

        break;
    }

};

public void updateButtonBackgrounds() {
    if (prefs.getInt(imageUrl.get(mImageNum), 0) == -1) {
        downVoteButton.setBackgroundResource(R.drawable.downvotepressed);
    } else if (prefs.getInt(imageUrl.get(mImageNum), 0) == 1) {
        upVoteButton.setBackgroundResource(R.drawable.upvotepressed);
    }
}

public static void sendVote(int vote, String imageName) {
    prefs.edit().putInt(imageName, vote).commit();
}

public void getSizes() {
    Display display = getActivity().getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    height = size.y;
}
}

HotFragment

package info.nightowl.nightowl;

public class HotFragment extends Fragment implements OnClickListener {

ToggleButton buttonGrid;
static Spinner spinnerUploadStatus;
CustomEditText et;
CustomScrollTextView tv;
int width, height;
View view;
static boolean isGrid;
ViewPager mPager;
SharedPreferences prefs;
public ImagePagerAdapter mPageAdapter;
Button buttonSwitchFragment;

Integer[] b = { R.drawable.statusunpressed, R.drawable.red,
        R.drawable.green, R.drawable.blue };

List<Integer> spinnerList = new ArrayList<Integer>(Arrays.asList(b));
CustomSpinnerAdapter myAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {

    prefs = getActivity().getSharedPreferences("prefs", 0);
    getSizes();
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.activity_feed, container, false);

    setup();

    return view;
}

@SuppressLint("NewApi")
public void setup() {

    isGrid = false;

    mPager = (ViewPager) view.findViewById(R.id.myviewpager1);
    mPager.setOffscreenPageLimit(0);

    buttonGrid = (ToggleButton) view.findViewById(R.id.button_grid);
    buttonGrid.setOnClickListener(this);

    spinnerUploadStatus = (Spinner) view
            .findViewById(R.id.buttonUploadStatus);

    myAdapter = new CustomSpinnerAdapter(getActivity(),
            R.layout.item_simple_list_item, spinnerList);
    myAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spinnerUploadStatus.setAdapter(myAdapter);
    spinnerUploadStatus.setDropDownWidth((int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, 50, getResources()
                    .getDisplayMetrics()));
    spinnerUploadStatus.setOnItemSelectedListener(myOnItemSelectedListener);
    spinnerUploadStatus.getBackground().setAlpha(0);

    buttonSwitchFragment = (Button) view
            .findViewById(R.id.buttonSwitchFragment);
    buttonSwitchFragment.setOnClickListener(this);

    Typeface font = Typeface.createFromAsset(getActivity().getAssets(),
            "NotCourierSans.ttf");
    et = (CustomEditText) view.findViewById(R.id.customEditText1);
    et.updateTypeFace(font);

    tv = (CustomScrollTextView) view
            .findViewById(R.id.customscrolltextview);
    tv.setText("WELCOME TO NIGHTOWL");
    tv.setTypeface(font);
    tv.start(width / 2500.0);

    Log.d("width", "width is " + width);
}

public void getSizes() {
    Display display = getActivity().getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    height = size.y;
}

@Override
public void onClick(View v) {

    switch (v.getId()) {

    case R.id.button_grid:

        isGrid = !isGrid;

        updateAdapter();
        break;
    case R.id.buttonSwitchFragment:
        ((NightWatch) getActivity()).scrollMainPager(1);
        break;

    }
}

public OnItemSelectedListener myOnItemSelectedListener = new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {

        spinnerUploadStatus.setSelection(0, true);
        et.sendText(prefs.getString("username", "username invalid"), arg2);

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }

};

public void scrollPager(int position) {

    isGrid = false;
    buttonGrid.setChecked(false);
    updateAdapter();

    mPager.setCurrentItem(position, true);
    Log.d("Pager", "PAGER UPDATED");
}

public static void disableButton(Boolean enabled) {
    spinnerUploadStatus.setEnabled(enabled);
}

public void updateAdapter() {
    int theSize;
    if (!isGrid)
        theSize = NightWatch.imageUrl.size();

    else if (NightWatch.imageUrl.size() % 9 > 0)
        theSize = NightWatch.imageUrl.size() / 9 + 1;
    else
        theSize = NightWatch.imageUrl.size() / 9;

    mPageAdapter = new ImagePagerAdapter(getChildFragmentManager(), theSize);
    mPager.setAdapter(mPageAdapter);

    Log.d("size of viewPager Adapter", "" + theSize);
}

public static class ImagePagerAdapter extends FragmentStatePagerAdapter {

    int mSize;

    public ImagePagerAdapter(FragmentManager fm, int size) {
        super(fm);

        mSize = size;
    }

    @Override
    public Fragment getItem(int arg0) {
        // TODO Auto-generated method stub
        Log.d("Starting imageDetailFragment", "");
        Log.d("Pager", "Pager starting fragment");

        Log.d("GRID", "fuck grid");
        if (!isGrid)
            return ImageDetailFragment.newInstance(arg0,
                    NightWatch.hotImageUrl, NightWatch.hotNameList,
                    NightWatch.hotTrendList, NightWatch.hotDateList);
        else
            return GridFragment.newInstance(arg0, NightWatch.imageUrl);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mSize;
    }
}

public class CustomSpinnerAdapter extends ArrayAdapter<Integer> {

    List<Integer> resourceId;
    Context c;

    public CustomSpinnerAdapter(Context context, int textViewResourceId,
            List<Integer> objects) {
        super(context, textViewResourceId, objects);

        resourceId = objects;
        c = context;

    }

    @Override
    public View getDropDownView(int position, View convertView,
            ViewGroup parent) {
        return getCustomDropdownView(position, convertView, parent);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }

    public View getCustomView(int position, View convertView,
            ViewGroup parent) {
        ImageView imageView = new ImageView(c);

        imageView.setImageResource(resourceId.get(position));
        imageView.setLayoutParams(new ListView.LayoutParams(
                (int) TypedValue.applyDimension(
                        TypedValue.COMPLEX_UNIT_DIP, 50, getResources()
                                .getDisplayMetrics()), (int) TypedValue
                        .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 34,
                                getResources().getDisplayMetrics())));

        return imageView;
    }

    public View getCustomDropdownView(int position, View convertView,
            ViewGroup parent) {
        ImageView imageView = new ImageView(c);

        imageView.setImageResource(resourceId.get(position));
        imageView.setLayoutParams(new ListView.LayoutParams(
                (int) TypedValue.applyDimension(
                        TypedValue.COMPLEX_UNIT_DIP, 50, getResources()
                                .getDisplayMetrics()), (int) TypedValue
                        .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 34,
                                getResources().getDisplayMetrics())));

        if (position == 0) {
            imageView.setVisibility(View.GONE);
        }

        return imageView;
    }

}

}

我没有看到发布其余片段的重点。内存泄漏在某处,我确定 如果有人帮我这个,我真的很感激。

2 个答案:

答案 0 :(得分:1)

以这种方式从URL加载位图将导致 IOException 。使用Picasso,您甚至不需要 asynctask 。只需在UI Thread中调用它:

Picasso.with(getActivity())
    .load(url)
    .into(imageView); //you can add .resize() before .into()

如果你真的想拥有Bitmap,可以使用以下代码:

new AsyncTask<Void, Void, Void>() {
            Bitmap bitmap;
            @Override
            protected void onPreExecute() {
                //some code
            }

            @Override
            protected Void doInBackground(Void... arg0) {
                bitmap = getBitmapFromURL(url);
                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                imageView.setImageBitmap(bitmap);
            }
        }.execute();

getBitmapFromURL()

public Bitmap getBitmapFromURL(String src) {
    try {
        URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        return BitmapFactory.decodeStream(input);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

答案 1 :(得分:1)

好的,所以我建议你坚持使用Picasso,因为这会让你的生活在内存管理和类似方面变得更容易。需要记住的一点是,无论图像类型如何(例如jpeg,png等),imageview中包含的图像最终都可以作为位图检索,因此如果您使用Picasso通过URL加载图像,您仍然可以将图像检索为加载后的位图并在其上应用转换。 Picasso还有一个名为.transform()的函数,您可以通过提供自定义转换来转换图像。以下是舍入转换的示例,首先是实现转换的代码:

//calcualte the raduis for the rounded images
final float scale = mContext.getResources().getDisplayMetrics().density; //get screen density for   scale
int pixels = (int) ((imageView.getWidth()-5) * scale); //get screen pixels based on density. Imageview is 60dp x 60dp in size, subtract some padding = 55
mRadiusCenter = pixels / 2;                                                 //get the raduis

//now load your image
 Picasso.with(mContext)
        .load(imageUrl)
        .fit().centerCrop()
        .transform(new RoundedTransformation(mRadiusCenter))
        .into(imageView);

您需要为实现Picasso Transformation的RoundedTransformation创建一个类:

// enables hardware accelerated rounded corners
// original idea here : http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/
public  class RoundedTransformation implements com.squareup.picasso.Transformation {
  private final int radius;

  // radius is corner radii in dp
  public RoundedTransformation(final int radius) {
      this.radius = radius;
  }

  @Override
  public Bitmap transform(final Bitmap source) {
      final Paint paint = new Paint();
      paint.setAntiAlias(true);
      paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));

      Bitmap output = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);

      Canvas canvas = new Canvas(output);
      canvas.drawCircle(radius, radius, radius, paint);

      if (source != output) {
          source.recycle();
      }

      return output;
  }

  @Override
  public String key() {
      return "rounded";
  }

}

以下是一些可能有用的链接:

https://gist.github.com/julianshen/5829333
Load large images with Picasso and custom Transform object

希望有所帮助!