Не могу разобраться, почему забивается память, и как с этим бороться... Вроде ресурсы освобождаю. Приложение отправляет картинку на сервер, картинка обрабатывается сервером и он возвращает url к уменьшенной копии, а также к оригиналу.
Main.java
Код: Выделить всё
package ru.beachbutts.beachbutts;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Base64;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
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.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main extends AppCompatActivity {
private final int LOAD_IMAGE_FROM_GALLERY_RESULTS = 555;
private final int LOAD_IMAGE_FROM_CAMERA_RESULTS = 777;
private String AccountEmail;
private String s_Base64;
private int start_from;
private GridView mGridView;
private GridViewAdapter mGridAdapter;
private ArrayList<GridItem> mGridData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
AccountEmail = preferences.getString("AccountEmail","");
FloatingActionButton fab_camera = (FloatingActionButton) findViewById(R.id.fab_camera);
fab_camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try
{
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, LOAD_IMAGE_FROM_CAMERA_RESULTS);
}
catch (ActivityNotFoundException cant)
{
Toast.makeText(Main.this, "Ваше устройство не поддерживает работу с камерой!", Toast.LENGTH_LONG).show();
}
}
});
FloatingActionButton fab_gallery = (FloatingActionButton) findViewById(R.id.fab_gallery);
fab_gallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(Intent.ACTION_PICK);
i.setType("image/*");
startActivityForResult(i, LOAD_IMAGE_FROM_GALLERY_RESULTS);
}
});
start_from = 0;
mGridView = (GridView) findViewById(R.id.gridView);
mGridData = new ArrayList<>();
mGridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, mGridData);
mGridView.setAdapter(mGridAdapter);
mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
GridItem item = (GridItem) parent.getItemAtPosition(position);
Intent intent = new Intent(Main.this, Image.class);
intent.putExtra("title", item.getTitle());
intent.putExtra("image", item.getUrl());
startActivity(intent);
}
});
new HttpAsyncTask_POST_get_images().execute("url for get_images);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode)
{
case LOAD_IMAGE_FROM_GALLERY_RESULTS:
if(resultCode == RESULT_OK && data != null)
{
try {
final Uri imageUri = data.getData();
final InputStream imageStream = getContentResolver().openInputStream(imageUri);
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
if(isConnected())
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
selectedImage.compress(Bitmap.CompressFormat.JPEG, 95, baos);
byte[] b = baos.toByteArray();
s_Base64 = Base64.encodeToString(b, Base64.DEFAULT);
selectedImage.recycle();
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
new HttpAsyncTask_POST_upload_image().execute("url for upload_image");
}
else
{
ShowMessage("Нет доступа к сети интернет.");
}
} catch (FileNotFoundException e) {
Toast.makeText(Main.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
break;
case LOAD_IMAGE_FROM_CAMERA_RESULTS:
if(resultCode == RESULT_OK && data != null)
{
final Uri imageUri = data.getData();
Bitmap cameraShot = (Bitmap) data.getExtras().get("data");
if(isConnected())
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
cameraShot.compress(Bitmap.CompressFormat.JPEG, 95, baos);
byte[] b = baos.toByteArray();
s_Base64 = Base64.encodeToString(b, Base64.DEFAULT);
cameraShot.recycle();
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
new HttpAsyncTask_POST_upload_image().execute("url for upload_image");
}
else
{
ShowMessage("Нет доступа к сети интернет.");
}
}
break;
}
}
public boolean isConnected() {
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Activity.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected())
return true;
else
return false;
}
final public void ShowMessage(String message)
{
final AlertDialog.Builder AlertMessage = new AlertDialog.Builder(this);
AlertMessage.setTitle("Сообщение");
AlertMessage.setMessage(message);
AlertMessage.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertMessage.setCancelable(false);
AlertMessage.create().show();
}
public static String POST(String url, ArrayList postParameters){
InputStream inputStream = null;
String result = "";
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
try {
httppost.setEntity(new UrlEncodedFormEntity(postParameters, "UTF-8"));
HttpResponse response = httpclient.execute(httppost);
inputStream = response.getEntity().getContent();
if(inputStream != null)
result = convertInputStreamToString(inputStream);
else
result = "Ошибка запроса!";
} catch (ClientProtocolException e) {
result = e.getMessage();
} catch (IOException e) {
result = e.getMessage();
}
return result;
}
private static String convertInputStreamToString(InputStream inputStream) throws IOException {
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
String line = "";
String result = "";
while((line = bufferedReader.readLine()) != null)
result += line;
inputStream.close();
return result;
}
//Загрузка картинки на сервер
public class HttpAsyncTask_POST_upload_image extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
ArrayList postParameters = new ArrayList();
postParameters.add(new BasicNameValuePair("email", AccountEmail));
postParameters.add(new BasicNameValuePair("base64", s_Base64));
return POST(urls[0],postParameters);
}
@Override
protected void onPostExecute(String result) {
JSONObject mJsonObject = null;
try
{
mJsonObject = new JSONObject(result);
String status = mJsonObject.getString("status");
switch(status)
{
case "ok":
GridItem item;
String added_dt = mJsonObject.getString("added_dt");
String url_thumb = mJsonObject.getString("url_thumb");
String url = mJsonObject.getString("url");
String id = mJsonObject.getString("id");
item = new GridItem();
item.setTitle(added_dt);
item.setImage(url_thumb);
item.setUrl(url);
item.setId(id);
mGridData.add(0, item);
mGridAdapter.setGridData(mGridData);
start_from++;
break;
case "fail":
ShowMessage(mJsonObject.getString("message"));
break;
default:
ShowMessage("Ошибка ответа сервера!");
break;
}
}
catch (JSONException e)
{
ShowMessage("Ошибка сети!");
}
}
}
public class HttpAsyncTask_POST_get_images extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
ArrayList postParameters = new ArrayList();
postParameters.add(new BasicNameValuePair("email", AccountEmail));
return POST(urls[0],postParameters);
}
@Override
protected void onPostExecute(String result) {
JSONObject mJsonObject = null;
try
{
mJsonObject = new JSONObject(result);
String status = mJsonObject.getString("status");
switch(status)
{
case "ok":
if(mJsonObject.getInt("num")>0)
{
JSONArray d_mJsonArray = mJsonObject.getJSONArray("data");
GridItem item;
for (int i = 0; i < d_mJsonArray.length(); i++)
{
JSONObject mJsonData = d_mJsonArray.getJSONObject(i);
String added_dt = mJsonData.getString("added_dt");
String url_thumb = mJsonData.getString("url_thumb");
String url = mJsonData.getString("url");
String id = mJsonData.getString("id");
item = new GridItem();
item.setTitle(added_dt);
item.setImage(url_thumb);
item.setUrl(url);
item.setId(id);
mGridData.add(item);
}
mGridAdapter.setGridData(mGridData);
start_from += mJsonObject.getInt("num");
}
break;
case "fail":
ShowMessage(mJsonObject.getString("message"));
break;
default:
ShowMessage("Ошибка ответа сервера!");
break;
}
}
catch (JSONException e)
{
ShowMessage("Ошибка сети!");
}
}
}
}
Код: Выделить всё
package ru.beachbutts.beachbutts;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.OkHttpDownloader;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
public class GridViewAdapter extends ArrayAdapter<GridItem> {
private Context mContext;
private int layoutResourceId;
private ArrayList<GridItem> mGridData = new ArrayList<GridItem>();
public GridViewAdapter(Context mContext, int layoutResourceId, ArrayList<GridItem> mGridData) {
super(mContext, layoutResourceId, mGridData);
this.layoutResourceId = layoutResourceId;
this.mContext = mContext;
this.mGridData = mGridData;
}
/**
* Updates grid data and refresh grid items.
* @param mGridData
*/
public void setGridData(ArrayList<GridItem> mGridData) {
this.mGridData = mGridData;
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder;
if (row == null) {
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.titleTextView = (TextView) row.findViewById(R.id.grid_item_title);
holder.idTextView = (TextView) row.findViewById(R.id.grid_item_id);
holder.urlTextView = (TextView) row.findViewById(R.id.grid_item_url);
holder.imageView = (ImageView) row.findViewById(R.id.grid_item_image);
row.setTag(holder);
} else {
holder = (ViewHolder) row.getTag();
}
GridItem item = mGridData.get(position);
holder.titleTextView.setText(item.getTitle());
holder.idTextView.setText(item.getId());
Picasso.Builder builder = new Picasso.Builder(mContext);
builder.downloader(new OkHttpDownloader(mContext, Integer.MAX_VALUE));
Picasso mPicasso = builder.build();
mPicasso.setIndicatorsEnabled(true);
mPicasso.load(item.getImage()).into(holder.imageView);
return row;
}
static class ViewHolder {
TextView urlTextView;
TextView idTextView;
TextView titleTextView;
ImageView imageView;
}
}
Код: Выделить всё
public class GridItem {
private String image;
private String title;
private String id;
private String url;
public GridItem() {
super();
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public void setId(String id) { this.id = id; }
public String getId() {
return id;
}
public void setUrl(String url) { this.url = url; }
public String getUrl() {
return url;
}
}