这是我关于运行这些联系人应用程序时内存不足的问题。我认为这些错误是由于图像而发生的。
在模拟器和 bluestacjk 中,此代码可以正常工作,但在移动设备上安装后,我出现内存不足错误。
此代码涉及在适配器的帮助下从列表中填充的手机中获取联系人详细信息,但在移动设备中不起作用。
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.app.ProgressDialog;
import android.content.ContentUris;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.admin.business_app.R;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
/**
* Created by admin on 3/15/2016.
*/
public class Contact_list extends Fragment {
// Declare Variables
ListView contactlistview;
ListViewAdapter listviewadapter;
List<WorldPopulation> worldpopulationlist = new ArrayList<WorldPopulation>();
Context context;
String[] name;
String[] phoneno;
ProgressDialog loading;
long contact_id;
Bitmap image;
Toolbar mToolbar;
EditText search_text;
//EditText editsearch;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootview = inflater.inflate(R.layout.listview_main, container, false);
{
super.onCreate(savedInstanceState);
// Get the view from listview_main.xml
//ActionBar actionBar = getSupportActionBar();
// mToolbar = (Toolbar) findViewById(R.id.contacts_toolbar);
// mToolbar.setTitle("Group");
// setSupportActionBar(mToolbar);
contactlistview = (ListView) rootview.findViewById(R.id.listview);
search_text = (EditText) rootview.findViewById(R.id.search);
search_text.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
String text = search_text.getText().toString().toLowerCase(Locale.getDefault());
listviewadapter.filter(text);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
});
// Generate sample data into string array
Cursor phones = getActivity().getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
null, null);
while (phones.moveToNext()) {
String name = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contact_id = phones.getLong(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
image = getFacebookPhoto(contact_id);
System.out.println("value of contacts id is :" + contact_id);
WorldPopulation objContact = new WorldPopulation();
objContact.setName(name);
objContact.setPhoneno(phoneNumber);
objContact.setPhoto(image);
worldpopulationlist.add(objContact);
}
phones.close();
listviewadapter = new ListViewAdapter(getActivity(), R.layout.listview_item,
worldpopulationlist);
if (null != worldpopulationlist && worldpopulationlist.size() != 0) {
Collections.sort(worldpopulationlist, new Comparator<WorldPopulation>() {
public int compare(WorldPopulation lhs, WorldPopulation rhs) {
return lhs.getName().compareTo(rhs.getName());
}
});
AlertDialog alert = new AlertDialog.Builder(
getActivity()).create();
alert.setTitle("");
alert.setMessage(worldpopulationlist.size() + " Contact Found!!!");
alert.setButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alert.show();
} else {
showToast("No Contact Found!!!");
} // Binds the Adapter to the ListView
contactlistview.setAdapter(listviewadapter);
contactlistview.setTextFilterEnabled(true);
contactlistview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
// Capture ListView item click
contactlistview.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode,
int position, long id, boolean checked) {
// Capture total checked items
final int checkedCount = contactlistview.getCheckedItemCount();
// Set the CAB title according to total checked items
mode.setTitle(checkedCount + " Selected");
// Calls toggleSelection method from ListViewAdapter Class
listviewadapter.toggleSelection(position);
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.selectAll:
final int checkedCount = worldpopulationlist.size();
listviewadapter.removeSelection();
for (int i = 0; i < checkedCount; i++) {
contactlistview.setItemChecked(i, true);
}
mode.setTitle(checkedCount + " Selected");
listviewadapter.notifyDataSetChanged();
return true;
case R.id.delete:
// Calls getSelectedIds method from ListViewAdapter Class
SparseBooleanArray selected = listviewadapter
.getSelectedIds();
// Captures all selected ids with a loop
for (int i = (selected.size() - 1); i >= 0; i--) {
if (selected.valueAt(i)) {
WorldPopulation selecteditem = listviewadapter
.getItem(selected.keyAt(i));
// Remove selected items following the ids
listviewadapter.remove(selecteditem);
Toast.makeText(getActivity(), "delete sucesdfully", Toast.LENGTH_SHORT).show();
}
}
// Close CAB
mode.finish();
listviewadapter.notifyDataSetChanged();
return true;
default:
return false;
}
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.contextualmenu, menu);
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// TODO Auto-generated method stub
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
return false;
}
});
}
return rootview;
}
private void showToast(String msg)
{
Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
}
public boolean onCreateOptionsMenu(Menu menu)
{
getActivity().getMenuInflater().inflate(R.menu.menu1, menu);
//final MenuItem item = menu.findItem(R.id.menu_item_search);
//final android.support.v7.widget.SearchView searchView = (android.support.v7.widget.SearchView) MenuItemCompat.getActionView(item);
// MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() {
// @Override
// public boolean onMenuItemActionCollapse(MenuItem item) {
// // Do something when collapsed
// listviewadapter.setFilter(worldpopulationlist);
// return true; // Return true to collapse action view
// }
//
// @Override
// public boolean onMenuItemActionExpand(MenuItem item) {
// // Do something when expanded
// return true; // Return true to expand action view
// }
// });
// Locate the EditText in menu.xml
// editsearch = (EditText) menu.findItem(R.id.menu_item_search).getActionView();
//
// // Capture Text in EditText
// editsearch.addTextChangedListener(textWatcher);
//
// // Show the search menu item in menu.xml
// MenuItem menuSearch = menu.findItem(R.id.menu_item_search);
//
// menuSearch.setOnActionExpandListener(new MenuItem.OnActionExpandListener()
// {
//
// // Menu Action Collapse
// @Override
// public boolean onMenuItemActionCollapse(MenuItem item) {
// // Empty EditText to remove text filtering
// editsearch.setText("");
// editsearch.clearFocus();
// return true;
// }
//
// // Menu Action Expand
// @Override
// public boolean onMenuItemActionExpand(MenuItem item) {
// // Focus on EditText
// editsearch.requestFocus();
//
// // Force the keyboard to show on EditText focus
// InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
// return true;
// }
// });
//
// // Show the settings menu item in menu.xml
// MenuItem menuSettings = menu.findItem(R.id.action_setting);
//
// // Capture menu item clicks
// menuSettings.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener()
// {
//
// @Override
// public boolean onMenuItemClick(MenuItem item) {
// // TODO Auto-generated method stub
// // Do something here
// Toast.makeText(getApplicationContext(), "Nothing here!",
// Toast.LENGTH_LONG).show();
// return false;
// }
//
// });
return true;
}
// private TextWatcher textWatcher = new TextWatcher()
// {
//
// @Override
// public void afterTextChanged(Editable s) {
// // TODO Auto-generated method stub
// String text = editsearch.getText().toString()
// .toLowerCase(Locale.getDefault());
// listviewadapter.filter(text);
// }
//
// @Override
// public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
// int arg3) {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// public void onTextChanged(CharSequence arg0, int arg1, int arg2,
// int arg3) {
// // TODO Auto-generated method stub
//
// }
//
// };
// @Override
// public boolean onQueryTextChange(String newText) {
// final List<WorldPopulation> filteredModelList = filter(worldpopulationlist, newText);
// listviewadapter.setFilter(filteredModelList);
// return true;
// }
//
// @Override
// public boolean onQueryTextSubmit(String query)
// {
// return false;
// }
//
// private List<WorldPopulation> filter(List<WorldPopulation> models, String query)
// {
// query = query.toLowerCase();
//
// final List<WorldPopulation> filteredModelList = new ArrayList<>();
// for (WorldPopulation model : models) {
// final String text = model.getName().toLowerCase();
// if (text.contains(query))
// {
// filteredModelList.add(model);
// }
// }
// return filteredModelList;
// }
public void Refresh_listview() {
// loading =ProgressDialog.show(MainActivity.this, "Updating", "Please wait...", false, false);
// loading.show();
listviewadapter.notifyDataSetChanged();
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.refresh:
//Refresh_listview();
return true;
case R.id.menu_item_search:
Toast.makeText(getActivity(),"click on it",Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
public Bitmap getFacebookPhoto(long contacsid)
{
System.out.println("value of conatcts id is in facebook funtion:"+contacsid);
Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contacsid);
Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.PHOTO);
ContentResolver cr = getActivity().getContentResolver();
Cursor contact = cr.query(photoUri,new String[] { ContactsContract.Contacts._ID }, null, null, null);
if (contact.moveToFirst()) {
//long userId = contact.getLong(contact.getColumnIndex(ContactsContract.Contacts._ID));
photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contacsid);
}
else {
Bitmap defaultPhoto = decodeSampledBitmapFromResource(getResources(), R.drawable.default_contact_image, 100, 100);
//decodeResource(getResources(), R.drawable.default_contact_image);
return defaultPhoto;
}
if (photoUri != null)
{
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, photoUri);
if (input != null)
{
return BitmapFactory.decodeStream(input);
}
} else
{
Bitmap defaultPhoto = decodeSampledBitmapFromResource(getResources(), R.drawable.default_contact_image, 100, 100);
// decodeResource(getResources(), R.drawable.default_contact_image);
return defaultPhoto;
}
Bitmap defaultPhoto = decodeSampledBitmapFromResource(getResources(), R.drawable.default_contact_image, 100, 100);
//decodeResource(getResources(), R.drawable.default_contact_image);
return defaultPhoto;
}
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight)
{
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
}
class ListViewAdapter extends ArrayAdapter<WorldPopulation>
{
// Declare Variables
Context context;
LayoutInflater inflater;
List<WorldPopulation> worldpopulationlist;
private SparseBooleanArray mSelectedItemsIds;
private ArrayList<WorldPopulation> arraylist;
int xDim,yDim;
public ListViewAdapter(Context context, int resourceId,
List<WorldPopulation> worldpopulationlist) {
super(context, resourceId, worldpopulationlist);
mSelectedItemsIds = new SparseBooleanArray();
this.context = context;
this.worldpopulationlist = worldpopulationlist;
this.arraylist = new ArrayList<WorldPopulation>();
this.arraylist.addAll(worldpopulationlist);
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return worldpopulationlist.size();
}
@Override
public WorldPopulation getItem(int position) {
return worldpopulationlist.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private class ViewHolder
{
TextView name;
TextView phoneno;
ImageView personphoto;
}
public View getView(final int position, View view, ViewGroup parent) throws IndexOutOfBoundsException {
final ViewHolder holder;
if (view == null)
{
holder = new ViewHolder();
view = inflater.inflate(R.layout.listview_item, null);
// Locate the TextViews in listview_item.xml
holder.name = (TextView) view.findViewById(R.id.contactname);
holder.phoneno = (TextView) view.findViewById(R.id.contactphone);
holder.personphoto = (ImageView) view.findViewById(R.id.contactsimages);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
// Capture position and set to the TextViews
holder.name.setText(worldpopulationlist.get(position).getName());
holder.phoneno.setText(worldpopulationlist.get(position).getPhoneno());
holder.personphoto.setImageBitmap(worldpopulationlist.get(position).getPhoto());
return view;
}
public void filter(String charText)
{
charText = charText.toLowerCase(Locale.getDefault());
worldpopulationlist.clear();
if (charText.length() == 0) {
worldpopulationlist.addAll(arraylist);
}
else
{
for (WorldPopulation wp : arraylist)
{
if (wp.getName().toLowerCase(Locale.getDefault()).contains(charText))
{
worldpopulationlist.add(wp);
}
}
}
notifyDataSetChanged();
}
@Override
public void remove(WorldPopulation object)
{
worldpopulationlist.remove(object);
notifyDataSetChanged();
}
public List<WorldPopulation> getWorldPopulation()
{
return worldpopulationlist;
}
public void toggleSelection(int position) {
selectView(position, !mSelectedItemsIds.get(position));
}
public void removeSelection()
{
mSelectedItemsIds = new SparseBooleanArray();
notifyDataSetChanged();
}
public void selectView(int position, boolean value) {
if (value)
mSelectedItemsIds.put(position, value);
else
mSelectedItemsIds.delete(position);
notifyDataSetChanged();
}
public int getSelectedCount()
{
return mSelectedItemsIds.size();
}
public SparseBooleanArray getSelectedIds() {
return mSelectedItemsIds;
}
// Filter Class
// public void filter(String charText)
// {
// charText = charText.toLowerCase(Locale.getDefault());
// worldpopulationlist.clear();
// if (charText.length() == 0) {
// worldpopulationlist.addAll(arraylist);
// }
// else
// {
// for (WorldPopulation wp : arraylist)
// {
// if (wp.getName().toLowerCase(Locale.getDefault()).contains(charText))
// {
// worldpopulationlist.add(wp);
// }
// }
// }
// notifyDataSetChanged();
// }
//
// public void setFilter(List<WorldPopulation> countryModels)
// {
// worldpopulationlist = new ArrayList<>();
// worldpopulationlist.addAll(countryModels);
// notifyDataSetChanged();
// }
public void Refresh_listview()
{
// loading =ProgressDialog.show(MainActivity.this, "Updating", "Please wait...", false, false);
// loading.show();
notifyDataSetChanged();
}
}
您是否尝试过在清单中启用 largeHeap?
<application
....
android:largeHeap="true"
.... >
</application>
有关更多信息,请参阅此内容
显示为联系人图像后回收位图
从内存中回收位图 您也可以尝试在清单应用程序中设置大堆="true"
您还可以阅读此解决方案以有效地处理位图对象
使用毕加索库加载图像,这将很有用。
它将解决您的内存不足问题。
它很容易,无需使用所有方法来获取位图图像。
Picasso.with(context).load(uri) .resize(50, 50).centerCrop().into(imageView)
访问这些链接获取毕加索图书馆
http://square.github.io/picasso/
https://github.com/square/picasso
从链接中,通过 gradle 获取库,通过放置这一行是 gradle 文件:
compile 'com.squareup.picasso:picasso:2.5.2'
我在你的代码中看到了这一点。 你正在使用
holder.personphoto.setImageBitmap(worldpopulationlist.get(position).getPhoto());
以获取图像。
注释此行,并使用此答案中的第一个代码行加载图像。