1

Я получаю утечку памяти из следующего кода. Это действие, которое содержит mainViewPager. Этот viewPager возвращает 4 разных фрагмента, каждый из которых имеет свои собственные ViewPagers, которые содержат изображения, которые извлекаются из одной и той же asyncTask. Вот мой код. Когда я его запускаю, я могу прокручивать страницы с некоторым запаздыванием. Но когда я выхожу назад, я получаю ошибку «Из памяти». Так что это должна быть утечка памяти. Я смотрел на свой код навсегда, и я не могу понять, почему. Пожалуйста, помогите мне ... PS. Я использую библиотеку Picasso для получения изображений с сервера.Android. Утечка памяти вызывает ошибку памяти. Использование панели просмотра.

активность

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; 
    } 

} 

} 

Я не вижу смысла в публикации остальных фрагментов. Утечка памяти где-то здесь, я уверен Я был бы очень признателен, если бы кто-то помог мне с этим.

ответ

1

Загрузка растрового изображения из URL таким образом вызовет IOException. С Picasso вам даже не нужно asynctask. Просто назвать это в UI Тема:

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; 
    } 
} 
+0

спасибо за ваш ответ, проблема в том, что мне нужно, чтобы это было растровое изображение, потому что я анализирую его в моем настраиваемом «RoundedCornersDrawable», чтобы сделать tbe изображение круглым, прежде чем устанавливать изображение. До сих пор я не получил и IOException. Должен ли я еще не использовать picasso ??? – Kyri33

+0

Если вам нужен битмап, то да, нет необходимости использовать Picasso. Просто используйте ** AsyncTask ** и ** getBitmapFromURL() **, как данный код выше. Вызовите парсер RoundedCornersDrawable в ** onPostExecute ** перед 'imageView.setImageBitmap (bitmap)'. Поместите AsyncTask в метод, например, 'public void loadBitmap()'. – Harry

+0

спасибо большое. А что касается любых утечек памяти ??? есть ли проблемы. Должен ли я скорее сделать мой hotFragment нестатичным или мне лучше возвратить HotFragment.newInstance (arg0) в моем адаптере. Также мои пользовательские FragmentStatePagerAdapters ... Должны ли они быть статическими или нестационарными, я смущен об этом – Kyri33

1

Хорошо, поэтому я бы порекомендовал вам использовать Picasso, так как это упростит вашу жизнь с точки зрения управления памятью и подобных. Следует помнить, что изображение, содержащееся в изображении, может в конечном итоге извлекаться как битмап независимо от типа изображения (например, jpeg, png и т. Д.), Поэтому, если вы используете 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); 

, которую вы должны создать класс для 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

Надеюсь, что это поможет!

Смежные вопросы