Partage

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

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

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?
11 septembre 2016 à 19:29:35

Un exemple pour ton soucis ou pour le pattern observateur ?
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

11 septembre 2016 à 23:44:41

merci ça marche :D merci beaucoup

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