Autore Topic: nullPointerException su tentativo di caricare un TextView da Thread  (Letto 693 volte)

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Sto cercando di creare un timer per il Poker, ho creato quindi una classe Timer che estende Thread, ma quando provo a caricare la TextView che mostrerà il timer mi dà NullPointerException dove sbaglio?

Codice (Java): [Seleziona]
package com.rudylanzarini;

import android.app.Activity;
import android.os.Handler;
import android.widget.TextView;

public class Timer extends Activity implements Runnable {

    final int INITSECONDS=0;
    final int INITMINUTE=10;

    Handler handler=new Handler();
    private int seconds=INITSECONDS;
    private int minute=INITMINUTE;

    TextView tvTimer= (TextView) findViewById(R.id.tvTimer); //<<<----- Errore in questa riga
    public void run(){
        while (PokerTimer.isRunning)
        {
            try {
                Thread.sleep(1000);
                seconds=seconds > 0 ? seconds-- : 59;
                minute--;
                tvTimer.setText(String.valueOf(seconds));
            } catch (InterruptedException e) {
                e.printStackTrace(); .
            }
            handler.post(this);
        }

    }

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:nullPointerException su tentativo di caricare un TextView da Thread
« Risposta #1 il: 06 Luglio 2013, 02:29:13 CEST »
0
puoi postare l'errore e il file xml?

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:nullPointerException su tentativo di caricare un TextView da Thread
« Risposta #2 il: 06 Luglio 2013, 12:22:30 CEST »
0
certo, ecco:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:orientation="vertical"
             android:layout_width="fill_parent"
             android:layout_height="fill_parent"
             android:padding="20dp"
       >
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"
                 android:orientation="horizontal" android:weightSum="100" android:gravity="center">
        <ImageButton android:layout_width="25dp" android:layout_height="10dp"
                    android:id="@+id/ibPrev" android:src="@drawable/arrow_sx" android:layout_weight="20"/>
        <TextView android:layout_height="wrap_content" android:layout_width="fill_parent"
                 android:text="Livello" android:id="@+id/tvLevel" android:gravity="center" android:layout_weight="70"/>
        <ImageButton android:layout_width="25dp" android:layout_height="10dp"
                    android:id="@+id/ibNext" android:src="@drawable/arrow_dx" android:layout_weight="20"/>
    </LinearLayout>
    <TextView
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:text="00:00"
           android:gravity="center" android:textSize="65dp" android:id="@+id/tvTimer"
           />
    <LinearLayout android:layout_height="wrap_content" android:layout_width="fill_parent"
                 android:orientation="horizontal" android:weightSum="100">
        <Button android:layout_width="fill_parent" android:layout_height="wrap_content"
               android:text="Start" android:id="@+id/bStart" android:layout_weight="50"/>
        <Button android:layout_height="wrap_content" android:layout_width="fill_parent"
               android:text="Stop" android:id="@+id/bStop" android:layout_weight="50"/>
                  </LinearLayout>
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"
                 android:orientation="horizontal" android:weightSum="100" android:paddingTop="20dp">
        <TextView android:layout_height="wrap_content" android:layout_width="fill_parent"
                 android:text="Small Blind" android:gravity="center" android:layout_weight="50"/>
        <TextView android:layout_height="wrap_content" android:layout_width="fill_parent"
                 android:text="Big Blind" android:gravity="center" android:layout_weight="50"/>
                  </LinearLayout>
    <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"
                 android:orientation="horizontal" android:weightSum="100" android:paddingTop="3dp">
        <TextView android:layout_height="wrap_content" android:layout_width="fill_parent"
                 android:text="1" android:gravity="center" android:layout_weight="50"
               android:id="@+id/tvSmall"/>
        <TextView android:layout_height="wrap_content" android:layout_width="fill_parent"
                 android:text="2" android:gravity="center" android:layout_weight="50"
               android:id="@+id/tvBig"/>
    </LinearLayout>

</LinearLayout>



e l'errore è

07-06 12:21:48.664: ERROR/AndroidRuntime(25967): FATAL EXCEPTION: main
        java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.rudylanzarini/com.rudylanzarini.PokerTimer}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2005)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2106)
        at android.app.ActivityThread.access$700(ActivityThread.java:134)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1217)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4856)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.NullPointerException
        at android.app.Activity.findViewById(Activity.java:1859)
        at com.rudylanzarini.Timer.<init>(Timer.java:16)
        at com.rudylanzarini.PokerTimer.<init>(PokerTimer.java:17)
        at java.lang.Class.newInstanceImpl(Native Method)
        at java.lang.Class.newInstance(Class.java:1319)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1068)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1996)
        ... 11 more

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Re:nullPointerException su tentativo di caricare un TextView da Thread
« Risposta #3 il: 06 Luglio 2013, 13:23:44 CEST »
0
Ciao.
Dal mio punto di vista il problema è legato al fatto che non invochi il metodo
Codice (Java): [Seleziona]
 setContentView(R.layout.NOMELAYOUT);La classe Timer che hai creato estende Activity, pertanto devi inserire il metodo onCreate all'interno del quale devi invocare dapprima il setContentview e poi istanzi la textview
Codice (Java): [Seleziona]
TextView tvTimer= (TextView) findViewById(R.id.tvTimer);
Inoltre da quello che ho potuto capire la classe Timer devo solo sovrascrivere una textview, quindi non capisco perchè estende la classe Activity. Secondo me ti basta dall'activity principale invocare il costruttore della classe Timer all'interno del quale passi la textview. in questo modo nella classe timer (che non estenderà più la classe Activity) puoi invocare il metodo setText sulla Textview.

Spero di essere stato abbastanza chiaro :-)

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:nullPointerException su tentativo di caricare un TextView da Thread
« Risposta #4 il: 06 Luglio 2013, 13:33:14 CEST »
0
Ma in questo modo il timer non si aggiorna ogni secondo perché non é all'interno del metodo run..

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Re:nullPointerException su tentativo di caricare un TextView da Thread
« Risposta #5 il: 06 Luglio 2013, 14:04:13 CEST »
+1
Il metodo setText lo devi invocare sempre nel metodo Run, così ogni secondo la textview viene aggiornata al nuovo valore.
Dall'activity principale, devi istanziare la textview nel metodo onCreate o nell'onResume dopodichè invochi il costruttore della classe Timer passandogli appunto la textview.
Qui di seguito ho aggiunto il costruttore alla classe Timer ed ho eliminato l'extends Activity.

Codice (Java): [Seleziona]
public class Timer  implements Runnable {

    final int INITSECONDS=0;
    final int INITMINUTE=10;

    Handler handler=new Handler();
    private int seconds=INITSECONDS;
    private int minute=INITMINUTE;

    private TextView tvTimer;

// costruttore
public Timer(TextView tv){
this.tvTimer = tv;
};


    public void run(){
        while (PokerTimer.isRunning)
        {
            try {
                Thread.sleep(1000);
                seconds=seconds > 0 ? seconds-- : 59;
                minute--;
                tvTimer.setText(String.valueOf(seconds));
            } catch (InterruptedException e) {
                e.printStackTrace(); .
            }
            handler.post(this);
        }

    }

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:nullPointerException su tentativo di caricare un TextView da Thread
« Risposta #6 il: 07 Luglio 2013, 13:23:43 CEST »
0
facendo come dici tu ora almeno la TextView cambia, dopo un secondo però il programma si arresta e c'è una nuova eccezione:
07-07 13:20:20.839: ERROR/AndroidRuntime(30685): FATAL EXCEPTION: Thread-22553
        android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4879)
        at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:979)
        at android.view.ViewGroup.invalidateChild(ViewGroup.java:4075)
        at android.view.View.invalidate(View.java:10328)
        at android.view.View.invalidate(View.java:10283)
        at android.widget.TextView.checkForRelayout(TextView.java:6554)
        at android.widget.TextView.setText(TextView.java:3702)
        at android.widget.TextView.setText(TextView.java:3560)
        at android.widget.TextView.setText(TextView.java:3535)
        at com.rudylanzarini.Timer.run(Timer.java:29)

 :-(

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:nullPointerException su tentativo di caricare un TextView da Thread
« Risposta #7 il: 08 Luglio 2013, 16:30:54 CEST »
0
L'handler che ho usato nn dovrebbe riaolvere questi tipi di eccezione?

Post unito: 08 Luglio 2013, 18:00:15 CEST
se potesse servire a qualcunaltro ho risolto così:

Codice (Java): [Seleziona]
package com.rudylanzarini;

import android.os.Handler;
import android.widget.TextView;

public class Timer extends Thread {
    TextView tvTimer;
    public Timer(TextView t) {
        this.tvTimer=t;

    }


    final int INITSECONDS=0;
    final int INITMINUTE=10;

    Handler handler=new Handler();
    private int seconds=INITSECONDS;
    private int minute=INITMINUTE;

    public void run(){System.out.println(PokerTimer.isRunning);
        while (PokerTimer.isRunning)
        {
            System.out.println(PokerTimer.isRunning);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            handler.post(new Runnable() {
                @Override
                public void run() {
                    seconds=seconds > 0 ? seconds-- : 59;
                    minute--;
                    tvTimer.setText(String.valueOf(seconds));
                }
            });
        }

    }

}
« Ultima modifica: 08 Luglio 2013, 18:00:15 CEST da rudj, Reason: Merged DoublePost »

Offline gigias

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • gigias6615
    • @gigias6615
    • Mostra profilo
  • Dispositivo Android:
    Table Nextway E9
  • Sistema operativo:
    Slackware 14.0 x64
Re:nullPointerException su tentativo di caricare un TextView da Thread
« Risposta #8 il: 12 Luglio 2013, 09:13:14 CEST »
0
Posso chiederti se quella variabile 'minute' è giusto che venga decrementata ogni secondo? Forse era per quello che il programma funzionava 1 secondo solo?

Inviato dal mio E9 con Tapatalk 2

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:nullPointerException su tentativo di caricare un TextView da Thread
« Risposta #9 il: 12 Luglio 2013, 14:29:48 CEST »
0
Ah, si è vero, qui i minuti cambiano ogni secondo,  è perché stavo facendo delle prove, poi l'algoritmo l'ho cambiato totalmente calcolando il modulo per i secondi e dividendo secondi totali/60 per i minuti,  comunque non era per  quello che si bloccava, infatti quando ho sistemato i minuti andavano sotto zero tranquillamente ;)