Autore Topic: Skipped XX frames!The application may be doing too much work on its main thread  (Letto 1265 volte)

Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Ciao a tutti,
apro questo 3d perché sto sbattendo la testa su un problema: sto provando a sviluppare un'app che invii un'immagine ad un web server, salvandola tramite php.
Il problema è il seguente: se provo a fare l'upload dell'immagine da cellulare utilizzando la rete wifi di casa tutto funziona perfettamente; se invece utilizzo la connessione dati ovviamente il tempo necessario all'upload è superiore e dopo una ventina di secondi l'app crasha.
L'errore che mi da è quello che ho scritto sul titolo. Ho fatto (ovviamente) diverse ricerche su internet ma non riesco a sistemare il pasticcio!

Vi incollo il codice responsabile di tutto ciò ed il LogCat. Spero riusciate a darmi una mano perché ci sto impazzendo da troppo tempo ormai..



Codice (Java): [Seleziona]
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private int RICHIESTA_IMMAGINE = 1;

    public static final String UPLOAD_URL = "http://TestoEditato/upload_imageData.php";

    private Uri indirizzoImmagine;
    private Bitmap bitmap_immagine;

    private ImageView immagine;
    private EditText nome;
    private Button btnUpload;

    private TextView testerNome;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nome = (EditText) findViewById(R.id.nome);

        testerNome = (TextView) findViewById(R.id.testerNome);

        immagine = (ImageView) findViewById(R.id.immagine);
        immagine.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fileChooser();
            }
        });

        btnUpload = (Button) findViewById(R.id.btnUpload);
        btnUpload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(immagine.getDrawable()==null){
                    Toast.makeText(getApplicationContext(),"Inserisci un'immagine",Toast.LENGTH_LONG).show();
                }
                else{
                    uploadImmagine();
                }
            }
        });
    }


    private void fileChooser(){ //Seleziono immagine da Galleria
        Intent cercaFile = new Intent();
        cercaFile.setType("image/*");
        cercaFile.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(cercaFile, "Seleziona immagine"), RICHIESTA_IMMAGINE);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == RICHIESTA_IMMAGINE && resultCode == RESULT_OK && data!=null && data.getData()!=null){
            indirizzoImmagine = data.getData();
            try{
                bitmap_immagine = MediaStore.Images.Media.getBitmap(getContentResolver(),indirizzoImmagine);
                immagine.setImageBitmap(bitmap_immagine);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



    private void uploadImmagine(){
        class Upload extends AsyncTask<Bitmap,Void,String>{

            String nomeString = nome.getText().toString();

            ProgressDialog loading;
            RequestHandler rh = new RequestHandler();

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(MainActivity.this,"Uploading...",null,true,true);
                loading.setCancelable(false);
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                Toast.makeText(getApplicationContext(),"Upload Completato, Risultato: " + s,Toast.LENGTH_LONG).show();
            }

            @Override
            protected String doInBackground(Bitmap... params) {
                Bitmap bitmap_immagine = params[0];

                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bitmap_immagine.compress(Bitmap.CompressFormat.PNG,10,baos);
                byte[] imageByte = baos.toByteArray();
                String uploadImage = Base64.encodeToString(imageByte,Base64.DEFAULT);

                HashMap<String,String> data = new HashMap<>();

                data.put("immagine",uploadImage);
                data.put("nome",nomeString);
                String result = rh.sendPostRequest(UPLOAD_URL, data);

                return result;
            }
        }
        Upload upp = new Upload();
        upp.execute(bitmap_immagine);
    }
}



e la classe RequestHandler.java:
Codice (Java): [Seleziona]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;


public class RequestHandler {
    public String sendPostRequest(String requestUrl, HashMap<String,String> postDataParams){
        URL url;
        StringBuilder sb = new StringBuilder();

        try {
            url = new URL(requestUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(15000);
            connection.setRequestMethod("POST");
            connection.setDoInput(true);
            connection.setDoOutput(true);


            OutputStream os = connection.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os,"UTF-8"));
            writer.write(getPostDataString(postDataParams));

            writer.flush();
            writer.close();
            os.close();
            int responseCode = connection.getResponseCode();

            if(responseCode == HttpURLConnection.HTTP_OK){
                BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                sb = new StringBuilder();
                String response;
                while ((response = br.readLine())!=null){
                    sb.append(response);
                }
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

    private String getPostDataString(HashMap<String,String> params)throws UnsupportedEncodingException{
        StringBuilder result = new StringBuilder();
        boolean first = true;
        for (Map.Entry<String,String> entry : params.entrySet()){
            if(first)
                first = false;
            else
                result.append("&");

            result.append(URLEncoder.encode(entry.getKey(),"UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(entry.getValue(),"UTF-8"));
        }
        return result.toString();
    }
}







Il LogCat è invece:
Codice: [Seleziona]
11-08 21:17:36.445 5955-6640/com.example.user.upload_image_data_001 E/dalvikvm-heap: Out of memory on a 8815982-byte allocation.
11-08 21:17:36.445 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm: "AsyncTask #1" prio=5 tid=11 RUNNABLE
11-08 21:17:36.445 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:   | group="main" sCount=0 dsCount=0 obj=0x445ed050 self=0x59af5d68
11-08 21:17:36.445 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:   | sysTid=6640 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1502958656
11-08 21:17:36.450 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:   | state=R schedstat=( 26116454045 11333410535 27827 ) utm=2570 stm=41 core=1
11-08 21:17:36.455 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:     at android.util.Base64.encode(Base64.java:~534)
11-08 21:17:36.455 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:     at android.util.Base64.encode(Base64.java:494)
11-08 21:17:36.455 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:     at android.util.Base64.encodeToString(Base64.java:456)
11-08 21:17:36.460 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:     at com.example.user.upload_image_data_001.MainActivity$1Upload.doInBackground(MainActivity.java:139)
11-08 21:17:36.460 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:     at com.example.user.upload_image_data_001.MainActivity$1Upload.doInBackground(MainActivity.java:109)
11-08 21:17:36.465 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:     at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-08 21:17:36.470 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
11-08 21:17:36.470 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-08 21:17:36.470 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
11-08 21:17:36.470 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
11-08 21:17:36.470 5955-6640/com.example.user.upload_image_data_001 I/dalvikvm:     at java.lang.Thread.run(Thread.java:841)
11-08 21:17:36.475 5955-6640/com.example.user.upload_image_data_001 W/dalvikvm: threadid=11: thread exiting with uncaught exception (group=0x41b8b730)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime: java.lang.RuntimeException: An error occured while executing doInBackground()
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at android.os.AsyncTask$3.done(AsyncTask.java:299)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:841)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:  Caused by: java.lang.OutOfMemoryError
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at android.util.Base64.encode(Base64.java:534)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at android.util.Base64.encode(Base64.java:494)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at android.util.Base64.encodeToString(Base64.java:456)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at com.example.user.upload_image_data_001.MainActivity$1Upload.doInBackground(MainActivity.java:139)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at com.example.user.upload_image_data_001.MainActivity$1Upload.doInBackground(MainActivity.java:109)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
11-08 21:17:36.480 5955-6640/com.example.user.upload_image_data_001 E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:841) 
11-08 21:17:45.730 5955-5955/com.example.user.upload_image_data_001 I/Choreographer: Skipped 526 frames!  The application may be doing too much work on its main thread.

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #1 il: 08 Novembre 2015, 23:50:25 CET »
0
Invece che fare l upload tramite php ,  ti conviene sfruttare l FTP ,  più potente ,  stabile e puoi gestire meglio eventuali upload falliti ... ovviamente è un mio umile parere  :-P

Post unito: 08 Novembre 2015, 23:53:09 CET
Comunque i problemi di out of memory quando si usano le immagini ... dipendono tanto dalle dimensioni eccessive ...
« Ultima modifica: 08 Novembre 2015, 23:53:09 CET da pietroconti89, Reason: Merged DoublePost »

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #2 il: 09 Novembre 2015, 10:29:21 CET »
0
Dove hai preso il codice per fare l'upload?
Non mi pare sia quello il metodo migliore per caricare file di grandi dimensioni.
L'idea è quella di partire dal tuo file e leggerlo un po' alla volta tramite un buffer di dimensioni adeguate e caricarlo gradualmente sul server, non copiare più volte l'intero file in array e stringhe.
Se cerchi con Google trovi del codice migliore (ora scrivo da tablet e non posso copia-incollare).

Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #3 il: 09 Novembre 2015, 12:50:27 CET »
0
Dove hai preso il codice per fare l'upload?
Non mi pare sia quello il metodo migliore per caricare file di grandi dimensioni.
L'idea è quella di partire dal tuo file e leggerlo un po' alla volta tramite un buffer di dimensioni adeguate e caricarlo gradualmente sul server, non copiare più volte l'intero file in array e stringhe.
Se cerchi con Google trovi del codice migliore (ora scrivo da tablet e non posso copia-incollare).
Ho preso spunto da un tutorial presente su internet. Comunque si, facendo ulteriori prove il problema è proprio nelle dimensioni delle immagini: se faccio una compressione maggiore il problema non sussiste ma se voglio un'immagine al 100% della qualità (Bitmap.CompressFormat.PNG,100,..) ecco che mi da l'errore.
Quindi penso che tu abbia ragione però non saprei come procedere alla tua soluzione, quando riesci mi incolli il codice di cui parli?

Grazie mille in anticipo!

Post unito: 09 Novembre 2015, 17:37:50 CET
Ho "parzialmente" risolto aggiungendo la seguente riga di codice che mi ridimensiona l'immagine bitmap presa dalla galleria:
Codice (Java): [Seleziona]
bitmap_immagine = Bitmap.createScaledBitmap(bitmap_immagine,200,200,false);Ho scritto parzialmente perché non so se in realtà questo mi risolverà ogni problema: non ho ben chiaro ancora se il problema di out of memory fosse dovuto alla dimensione (altezza*larghezza) dell'immagine o al suo peso (kb). Ovviamente con questa soluzione che ho trovato risolvo entrambe le situazioni (ridimensionando l'immagine viene ridotta significamente anche il suo peso.
Vorrei sapere se avete qualche consiglio a riguardo, anche perché vorrei evitare problemi e crash futuri (vorrei utilizzare quest'app in altri dispositivi).

Infine, avrei due dubbi:
1) la funzione Bitmap.createScaledBitmap ha come ultimo valore un boolean che a quanto pare rappresenta il filtro. Ma che tipo di filtro? Cosa cambia mettere true o false? Ho cercato ma non ho trovato nulla a riguardo.
2) in caso di ulteriore problema di "out of memory" come faccio ad evitare il crash diretto e invece mostrare a schermo un messaggio d'errore (toast, dialog o qualsiasi altra cosa)? Che parte devo delimitare con un try-catch ??


Grazie ancora :)
« Ultima modifica: 09 Novembre 2015, 17:37:50 CET da Klizard, Reason: Merged DoublePost »

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #4 il: 09 Novembre 2015, 20:02:20 CET »
0
Ciao indubbiamente è corretto cambiare risoluzione all immagine in quanto devi sapere che android riserva una memoria per ogni app variabile tra i 30 mb e i 60 mb " forse qualcosa in più forse qualcosa in meno " , ma ragioniamo su un fattore , tu scrivi

" Il problema è il seguente: se provo a fare l'upload dell'immagine da cellulare utilizzando la rete wifi di casa tutto funziona perfettamente; se invece utilizzo la connessione dati ovviamente il tempo necessario all'upload è superiore e dopo una ventina di secondi l'app crasha. "

ovvero il problema si presenta se utilizzi connessione dati e non quando sei in wifi , mi viene da pensare che il problema si presenta maggiormente quando la connessione è a bassa intensità , e credo puoi verificarlo facilmente mettendoti in una posizione in cui il segnale telefonico è più forte e quindi maggior velocità ! , ridurre semplicemente le dimensioni senza considerare l'aspetto connessione può portare fuori strada , questo perchè è ovvio che trasferire 400 kb invece di 2 mb utilizzerà tempi minori di trasferimento e i crash potrebbero non presentarsi più , ma in casi di segnale telefonico quasi assente il problema potrebbe presentarsi nuovamente .... quindi rammento il consiglio dato in precedenza , e ti invito a utilizzare il servizio FTP invece che un trasferimento dati tramite php , ti do un esempio che può capitare se continui con la strada del php .... trasferimento dati iniziato e sei al 60 % del totale trasferito , ti dice sfiga e la connessione cade , tramite quel tipo di trasferimento risulterebbe molto molto ma molto difficile gestire questo tipo di upload fallito , intasando il tuo server online di file mezzi vuoti e non leggibile , tramite FTP questo tipo di gestione invece è possibile e molto facilmente e quindi non rischi di inceppare in caricamenti a metà , poi al solito è un pare  ;-)

Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #5 il: 09 Novembre 2015, 20:20:00 CET »
0
Ciao indubbiamente è corretto cambiare risoluzione all immagine in quanto devi sapere che android riserva una memoria per ogni app variabile tra i 30 mb e i 60 mb " forse qualcosa in più forse qualcosa in meno " , ma ragioniamo su un fattore , tu scrivi

" Il problema è il seguente: se provo a fare l'upload dell'immagine da cellulare utilizzando la rete wifi di casa tutto funziona perfettamente; se invece utilizzo la connessione dati ovviamente il tempo necessario all'upload è superiore e dopo una ventina di secondi l'app crasha. "

ovvero il problema si presenta se utilizzi connessione dati e non quando sei in wifi , mi viene da pensare che il problema si presenta maggiormente quando la connessione è a bassa intensità , e credo puoi verificarlo facilmente mettendoti in una posizione in cui il segnale telefonico è più forte e quindi maggior velocità ! , ridurre semplicemente le dimensioni senza considerare l'aspetto connessione può portare fuori strada , questo perchè è ovvio che trasferire 400 kb invece di 2 mb utilizzerà tempi minori di trasferimento e i crash potrebbero non presentarsi più , ma in casi di segnale telefonico quasi assente il problema potrebbe presentarsi nuovamente .... quindi rammento il consiglio dato in precedenza , e ti invito a utilizzare il servizio FTP invece che un trasferimento dati tramite php , ti do un esempio che può capitare se continui con la strada del php .... trasferimento dati iniziato e sei al 60 % del totale trasferito , ti dice sfiga e la connessione cade , tramite quel tipo di trasferimento risulterebbe molto molto ma molto difficile gestire questo tipo di upload fallito , intasando il tuo server online di file mezzi vuoti e non leggibile , tramite FTP questo tipo di gestione invece è possibile e molto facilmente e quindi non rischi di inceppare in caricamenti a metà , poi al solito è un pare  ;-)
Innanzitutto grazie per i consigli.
Per quanto riguarda la connessione hai ragione: con la rete wifi non accade nessun crash.
Mi piace l'idea di usare l'ftp però non saprei da dove iniziare. Sapresti indicarmi la "via" su come modificare il mio codice? Avevo scelto il php perché oltre all'upload di immagini aggiorno anche delle informazioni su un database online (tramite php incollo nel db un riferimento all'indirizzo in cui si trova l'immagine). Potrei far la stessa cosa tramite ftp?

Grazie ancora!

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #6 il: 09 Novembre 2015, 20:26:42 CET »
0
Guarda ora sono fuori ,  domani ti posto la soluzione che utilizzo io

Inviato dal mio SM-N9005 utilizzando Tapatalk


Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #7 il: 10 Novembre 2015, 00:41:30 CET »
0
Guarda ora sono fuori ,  domani ti posto la soluzione che utilizzo io

Inviato dal mio SM-N9005 utilizzando Tapatalk
Okk danke! :)

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #8 il: 10 Novembre 2015, 16:39:02 CET »
+1
allora il metodo per eseguire l'upload è il seguente
Codice (Java): [Seleziona]
public static boolean FtpPutDate(String NOMEFILE, File fileUpload) {
                FTPClient client= new FTPClient();
                try {
                        InetAddress indirizzo = InetAddress.getByName("ftp.hostnameserver.altervista.org");
                        client.connect(indirizzo);
                        Log.e("FTP Service", client.getReplyString());
                        //aperta la connessione al server procedo al login
                        boolean loggato=client.login("TUAUSERNAME", "TUAPASSWORD");
                        if(loggato==true) Log.e("FTP Service"," ....login effettuato");
                        else Log.e("FTP Service","...login fallito");
                        //apro il file contenuto nel path /sdcard come stream
                        client.enterLocalPassiveMode();
                        try {
                                client.setFileType(FTP.BINARY_FILE_TYPE);
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                        try {
                                client.changeWorkingDirectory("/DIRECTORY_DOVE_SALVARE");
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                        FileInputStream fis = new FileInputStream(fileUpload);//creo uno stream in input a partire dal mio file
                        boolean upload_ok=client.storeFile(NOMEFILE, fis);
                        fis.close();//procedo alla chiusura dello stream
                        if(upload_ok==true)Log.e("FTP Service","  ..... upload ok");
                        else Log.e("FTP Service","....upload fallito, errore: " + upload_ok);
                        return true;
                } catch (SocketException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
                return false;
        }

come vedi gli passo i parametri "NOME DEL FILE " e " IL FILE DA SALVARE " , il tutto va inserito in una asyntask come segue
Codice (Java): [Seleziona]
class sendImageToServerByParam extends AsyncTask<Void, Void, String> {
                File file;
                ProgressDialog uploaddialog;
                String NOMEFILE;
                public AsyncResponse delegate;
                public sendImageToServerByParam(File file,String NOMEFILE, AsyncResponse delegate) {
                        this.file=file;
                        this.NOMEFILE=NOMEFILE;
                        this.delegate=delegate;
                }
                @Override
                protected String doInBackground(Void... unsued) {
                        if(FtpPutDate(NOMEFILE,file))
                                return "success";
                        else return  "fail";
                }

                @Override
                protected void onProgressUpdate(Void... unsued) {

                }
                @Override
                protected void onPreExecute() {
                        uploaddialog = ProgressDialog.show(getActivity(), "Uploading",
                                        "Please wait...", true);

                }

                @Override
                protected void onPostExecute(String sResponse) {
                        if(sResponse.equals("fail")) delegate.ReturnaAsyncResponse(0);
                        else delegate.ReturnaAsyncResponse(1);
                        Toast.makeText(getActivity(), String.valueOf(sResponse), Toast.LENGTH_SHORT).show();
                        try {
                                if (uploaddialog.isShowing()) {
                                        uploaddialog.dismiss();
                                }
                        } catch (Exception e) {
                                Toast.makeText(getActivity(),
                                                e.getMessage(),
                                                Toast.LENGTH_LONG).show();
                                Log.e(e.getClass().getName(), e.getMessage(), e);
                        }
                }

        }
       
a questa task passiamo il file da inviare, il Nome del file , e la CallBack , a seguire la callback
Codice (Java): [Seleziona]
public interface AsyncResponse {
                public void ReturnaAsyncResponse(int flag);
        }

e ora sei pronto ad eseguire la task nel onCreate(......)

Codice (Java): [Seleziona]
new sendImageToServerByParam(file, NOMEIMG, new AsyncResponse() {
                @Override
                public void ReturnaAsyncResponse(int flag) {
                        if (flag== 1){
                                //qui in caso di successo puoi lanciare la nuova task per modificare i record del database !
                        } else if (flag == 0) {
                                //in caso di upload fallito, fai ciò che ritieni più opportuno
                        }
                }
        }).execute();

direi che è tutto  ;-)

Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #9 il: 10 Novembre 2015, 17:13:40 CET »
0
allora il metodo per eseguire l'upload è il seguente
Codice (Java): [Seleziona]
public static boolean FtpPutDate(String NOMEFILE, File fileUpload) {
                [color=red]FTPClient [/color]client= new FTPClient();
                try {
                        InetAddress indirizzo = InetAddress.getByName("ftp.hostnameserver.altervista.org");
                        client.connect(indirizzo);
                        Log.e("FTP Service", client.getReplyString());
                        //aperta la connessione al server procedo al login
                        boolean loggato=client.login("TUAUSERNAME", "TUAPASSWORD");
                        if(loggato==true) Log.e("FTP Service"," ....login effettuato");
                        else Log.e("FTP Service","...login fallito");
                        //apro il file contenuto nel path /sdcard come stream
                        client.enterLocalPassiveMode();
                        try {
                                client.setFileType(FTP.BINARY_FILE_TYPE);
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                        try {
                                client.changeWorkingDirectory("/DIRECTORY_DOVE_SALVARE");
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                        FileInputStream fis = new FileInputStream(fileUpload);//creo uno stream in input a partire dal mio file
                        boolean upload_ok=client.storeFile(NOMEFILE, fis);
                        fis.close();//procedo alla chiusura dello stream
                        if(upload_ok==true)Log.e("FTP Service","  ..... upload ok");
                        else Log.e("FTP Service","....upload fallito, errore: " + upload_ok);
                        return true;
                } catch (SocketException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
                return false;
        }
Questo metodo va inserito dentro la classe sendImageToserverByParam ? Mi da l'errore su FTPClient (non mi fa importare nulla)

Citazione
Codice (Java): [Seleziona]
class sendImageToServerByParam extends AsyncTask<Void, Void, String> {
                File file;
                ProgressDialog uploaddialog;
                String NOMEFILE;
                public [color=red]AsyncResponse [/color]delegate;
                public sendImageToServerByParam(File file,String NOMEFILE, AsyncResponse delegate) {
                        this.file=file;
                        this.NOMEFILE=NOMEFILE;
                        this.delegate=delegate;
                }
                @Override
                protected String doInBackground(Void... unsued) {
                        if(FtpPutDate(NOMEFILE,file))
                                return "success";
                        else return  "fail";
                }

                @Override
                protected void onProgressUpdate(Void... unsued) {

                }
                @Override
                protected void onPreExecute() {
                        uploaddialog = ProgressDialog.show(getActivity(), "Uploading",
                                        "Please wait...", true);

                }

                @Override
                protected void onPostExecute(String sResponse) {
                        if(sResponse.equals("fail")) delegate.ReturnaAsyncResponse(0);
                        else delegate.ReturnaAsyncResponse(1);
                        Toast.makeText(getActivity(), String.valueOf(sResponse), Toast.LENGTH_SHORT).show();
                        try {
                                if (uploaddialog.isShowing()) {
                                        uploaddialog.dismiss();
                                }
                        } catch (Exception e) {
                                Toast.makeText(getActivity(),
                                                e.getMessage(),
                                                Toast.LENGTH_LONG).show();
                                Log.e(e.getClass().getName(), e.getMessage(), e);
                        }
                }

        }
       
Creando questa nuova classe mi da degli errori (dice che sono sconosciuti) AsyncResponse.

Citazione
Codice (Java): [Seleziona]
public interface AsyncResponse {
                public void ReturnaAsyncResponse(int flag);
        }
Questa parte dove dovrei metterla?



Grazie ancora!

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #10 il: 10 Novembre 2015, 17:31:59 CET »
+1
cosi .....
Codice (Java): [Seleziona]
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import java.io.FileInputStream;
import java.io.IOException;

import java.net.InetAddress;
import java.net.SocketException;


/**
 * Created by Pietro on 10/11/15.
 */

public class UploadActivity extends ActionBarActivity {
    private Context mContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);
        mContext = UploadActivity.this;
       
        new sendImageToServerByParam(file, "NOMEFILE.jpg", new AsyncResponse() {
            @Override
            public void ReturnaAsyncResponse(int flag) {
                if (flag== 1){
                    //qui in caso di successo puoi lanciare la nuova task per modificare i record del database !
                } else if (flag == 0) {
                    //in caso di upload fallito, fai ciò che ritieni più opportuno
                }
            }
        }).execute();
    }
    class sendImageToServerByParam extends AsyncTask<Void, Void, String> {
        File file;
        ProgressDialog uploaddialog;
        String NOMEFILE;
        public AsyncResponse delegate;
        public sendImageToServerByParam(File file,String NOMEFILE, AsyncResponse delegate) {
            this.file=file;
            this.NOMEFILE=NOMEFILE;
            this.delegate=delegate;
        }
        @Override
        protected String doInBackground(Void... unsued) {
            if(FtpPutDate(NOMEFILE,file))
                return "success";
            else return  "fail";
        }

        @Override
        protected void onProgressUpdate(Void... unsued) {

        }
        @Override
        protected void onPreExecute() {
            uploaddialog = ProgressDialog.show(mContext, "Uploading",
                    "Please wait...", true);

        }

        @Override
        protected void onPostExecute(String sResponse) {
            if(sResponse.equals("fail")) delegate.ReturnaAsyncResponse(0);
            else delegate.ReturnaAsyncResponse(1);
            Toast.makeText(mContext, String.valueOf(sResponse), Toast.LENGTH_SHORT).show();
            try {
                if (uploaddialog.isShowing()) {
                    uploaddialog.dismiss();
                }
            } catch (Exception e) {
                Toast.makeText(mContext,
                        e.getMessage(),
                        Toast.LENGTH_LONG).show();
                Log.e(e.getClass().getName(), e.getMessage(), e);
            }
        }

    }
    public static boolean FtpPutDate(String NOMEFILE, File fileUpload) {
        FTPClient client= new FTPClient();
        try {
            InetAddress indirizzo = InetAddress.getByName("ftp.hostnameserver.altervista.org");
            client.connect(indirizzo);
            Log.e("FTP Service", client.getReplyString());
            //aperta la connessione al server procedo al login
            boolean loggato=client.login("TUAUSERNAME", "TUAPASSWORD");
            if(loggato==true) Log.e("FTP Service"," ....login effettuato");
            else Log.e("FTP Service","...login fallito");
            //apro il file contenuto nel path /sdcard come stream
            client.enterLocalPassiveMode();
            try {
                client.setFileType(FTP.BINARY_FILE_TYPE);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                client.changeWorkingDirectory("/DIRECTORY_DOVE_SALVARE");
            } catch (IOException e) {
                e.printStackTrace();
            }
            FileInputStream fis = new FileInputStream(fileUpload);//creo uno stream in input a partire dal mio file
            boolean upload_ok=client.storeFile(NOMEFILE, fis);
            fis.close();//procedo alla chiusura dello stream
            if(upload_ok==true)Log.e("FTP Service","  ..... upload ok");
            else Log.e("FTP Service","....upload fallito, errore: " + upload_ok);
            return true;
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
    public interface AsyncResponse {
        public void ReturnaAsyncResponse(int flag);
    }

}
le librerie fondamentali per usare l FTPClient sono le seguenti , per utilizzarle devi importare la libreria " commons-net.jar "
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

la puoi scaricare al seguente link
http://www.java2s.com/Code/JarDownload/apache-commons/apache-commons-net.jar.zip

Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #11 il: 10 Novembre 2015, 18:59:15 CET »
0
Grazie mille davvero, mi hai risolto ogni problema: avevi ragione l'ftp è un metodo di gran lunga migliore: ho provato upload di immagini molto grandi utilizzando una precaria connessione dati e non ho avuto nessun problema.
Ti sono debitore :)

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #12 il: 10 Novembre 2015, 19:43:37 CET »
0
 ;-)   

Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #13 il: 10 Novembre 2015, 20:40:07 CET »
0
Un'ultima domanda: per fare invece il download cosa mi consigli? Perché usavo php anche per questo e sto notando gli stessi problemi (l'app crasha se faccio il download di immagini grandi)

Grazie ancora!

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Skipped XX frames!The application may be doing too much work on its main thread
« Risposta #14 il: 10 Novembre 2015, 21:11:29 CET »
+1
Un'ultima domanda: per fare invece il download cosa mi consigli? Perché usavo php anche per questo e sto notando gli stessi problemi (l'app crasha se faccio il download di immagini grandi)

Grazie ancora!
Se vuoi risolvere facilmente e in maniera rapida ,  utilizza la libreria Picasso,   se cerchi in Google trovi subito come implementarla nel tuo progetto ,  ed è davvero molto semplice , ma se ti va di perder tempo  in maniera costruttiva ti invito a dare un occhiata a l Universal Image Loader ,  trovi i sorgenti su github ,  la trovo più efficiente e crea anche una cache delle immagini che scarichi ... ciò significa che una volta scaricata una foto se la salva in maniera che se ti trovi a caricarla nuovamente non dovrai effettuare il download

Inviato dal mio SM-N9005 utilizzando Tapatalk