"Забивается" память

Ответить
Dimitry82
Сообщения: 3
Зарегистрирован: 16 окт 2015, 11:07

"Забивается" память

Сообщение Dimitry82 » 21 окт 2015, 11:05

Добрый день, господа!

Не могу разобраться, почему забивается память, и как с этим бороться... Вроде ресурсы освобождаю. Приложение отправляет картинку на сервер, картинка обрабатывается сервером и он возвращает 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("Ошибка сети!");
            }
        }
    }

}
GridViewAdapter.java

Код: Выделить всё

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;
    }
}
GridItem.java

Код: Выделить всё

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

Dimitry82
Сообщения: 3
Зарегистрирован: 16 окт 2015, 11:07

Re: "Забивается" память

Сообщение Dimitry82 » 23 окт 2015, 16:35

Вопрос решил. Всем спасибо

Ответить