Partage
  • Partager sur Facebook
  • Partager sur Twitter

Android : erreur dans l'Utilisation d' AsyncTask

Sujet résolu
    10 septembre 2016 à 22:22:17

    Bonsoir tout le monde

    je travail sur une application qui permet de lire un fichier de type Json sur un serveur distant et d'afficher le contenu du fichier ...

    j'ai utilisé l'exemple du fichier http://jsonparsing.parseapp.com/jsonData/moviesDemoItem.txt

    Je ne parviens pas a interpréter les  erreurs du log et a trouver une solution

    aidez moi svp !!!

    voici mon code MainActivity.java

    import android.app.Activity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    public class MainActivity extends Activity {
        private TextView tvdata;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button btnHit = (Button)findViewById(R.id.btnHit);
            TextView tvdata = (TextView)findViewById(R.id.tvJsonItem);
    
            btnHit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new JSONTask().execute("http://http://jsonparsing.parseapp.com/jsonData/moviesDemoItem.txt");
                }
                    //tvdata.setText("gabin");
            });
        }
    
    
        public class JSONTask extends AsyncTask<String, String, String>{
    
            @Override
            protected String doInBackground(String... params) {
                HttpURLConnection connection = null;
                BufferedReader reader = null;
                try {
                    //URL url = new URL("http://10.0.2.2/andro/get.txt");
                    URL url = new URL(params[0]);
                    //URL url = new URL("10.0.2.2/get.txt");
                    connection = (HttpURLConnection) url.openConnection();
                    connection.connect();
    
                    InputStream stream = connection.getInputStream();
                    reader = new BufferedReader(new InputStreamReader(stream));
    
                    String line = "";
                    StringBuffer buffer = new StringBuffer();
    
                    while ((line = reader.readLine()) != null) {
                        buffer.append(line + "");
                    }
    
                    return buffer.toString();
    
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (connection != null) {
                        connection.disconnect();
                    }
                    try {
                        if (reader != null) {
                            reader.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return null;
            }
    
    
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                tvdata.setText(result);
            }
        }
    
    }
    

    et celui de activity xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="@dimen/activity_vertical_margin"
        android:orientation="vertical"
        tools:context="parsing.json.com.jsonparsindemo.MainActivity">
    
        <Button
            android:id="@+id/btnHit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5sp"
            android:text="Hit"/>
    
        <TextView
            android:id="@+id/tvJsonItem"
            android:layout_margin="5sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!" />
    </LinearLayout>

    et les erreurs

    09-10 21:25:11.372 6991-6991/parsing.json.com.jsonparsindemo E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                   Process: parsing.json.com.jsonparsindemo, PID: 6991
                                                                                   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                                                                                       at parsing.json.com.jsonparsindemo.MainActivity$JSONTask.onPostExecute(MainActivity.java:87)
                                                                                       at parsing.json.com.jsonparsindemo.MainActivity$JSONTask.onPostExecute(MainActivity.java:39)
                                                                                       at android.os.AsyncTask.finish(AsyncTask.java:651)
                                                                                       at android.os.AsyncTask.-wrap1(AsyncTask.java)
                                                                                       at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
                                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                       at android.os.Looper.loop(Looper.java:148)
                                                                                       at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)


    bien évidemment j'ai autorisé la permission INTERNET

    Merci de m'aider

    -
    Edité par gabinsoft 10 septembre 2016 à 22:26:05

    • Partager sur Facebook
    • Partager sur Twitter
      11 septembre 2016 à 16:50:20

      Salut,

      java.lang.NullPointerException

      C'est une erreur qui arrive quand tu tentes d'accéder à une variable ou un objet qui n'a pas été initialisé

      Quand tu cliques sur ton bouton, tu invoques directement execute() de ton AsyncTask sans passer par le contructeur pour lui donner en paramètre ton TextView. Du coup, il reste nul au moment où tu appelles execute()

      Quand tu cliques sur ton bouton, il faut instancier un objet JSONTask (donc tu seras obligé de passer en paramètre ton TextView) et après seulement appeler execute()


      Ensuite pour ton propre confort de codage, je te conseille de voir du côté du pattern observer pour bien séparer l'interface graphique de la partie traitement. Imagine que tu es besoin de modifier 15 View différentes... Passer tout ça en paramètre dans le constructeur ça ferait un peu lourd

      -
      Edité par Anthonyyy 11 septembre 2016 à 16:55:25

      • Partager sur Facebook
      • Partager sur Twitter
        11 septembre 2016 à 18:33:20

        merci pour cette précision...Je m'appliquerai la prochaine fois . mais j'ai jamais faire cela stp puis-je avoir un exemple?
        • Partager sur Facebook
        • Partager sur Twitter
          11 septembre 2016 à 19:29:35

          Un exemple pour ton soucis ou pour le pattern observateur ?
          • Partager sur Facebook
          • Partager sur Twitter
            11 septembre 2016 à 21:58:16

            Rajoute ça en haut de ta classe JSONTask :

            private TextView _monTextView;
            
            public JSONTask(TextView tv)
            {
            	_monTextView = tv;
            }

            Et dans ton onClick():

            JSONTask jsonTask = new JSONTask(tonTextView);
            jsonTask.execute("ton_url");


            Bien sûr en remplaçant tonTextView par la variable adéquate (qui devra être déclaré final)



            -
            Edité par Anthonyyy 11 septembre 2016 à 22:00:37

            • Partager sur Facebook
            • Partager sur Twitter
              11 septembre 2016 à 23:44:41

              merci ça marche :D merci beaucoup
              • Partager sur Facebook
              • Partager sur Twitter

              Android : erreur dans l'Utilisation d' AsyncTask

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown