• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Apps Help with basic threading / message handling (NullPointerException)

Hello everyone! I'm relatively new to java programming and developing on android, but I realized that I would need to learn how to handle threads if I ever wanted to make interactive games on android. So I designed a simple app to see if I could figure it out. Unfortunately, it does not work.

Here's the app I came up with: It should simply display one text view on the screen. A handler should be set up in the main thread that will respond to messages - if the message sent contains the value 1, then it should set the text of this text view to "Start." If it receives a 2, then it should change that text to "It worked!"

That message should come from the other, secondary thread, which should perform like this: It contains one variable, an int named counter that starts off at 0. Then, if the counter is 0, the counter is set to 1, and the value of counter is sent to the main thread handler in the what field of a message called m (where the main thread handler should receive it and change the text view text to "Start."). Then, the thread should sleep for 5 seconds. When it resumes and runs a second time, it should change the value of counter to 2, and send that to the main thread handler, which would then change the text view text to "It worked!"

Here is the code:
Code:
   package com.thread.test;

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

    public class threadTest extends Activity {
       
       //Fields
       TextView myTextView = null;
       
       Thread refreshThread = null;
       
       //Handler
       Handler updateHandler = new Handler()
       {
       
          //Handle message routine
          //This gets called on every message that is recieved
         
          //@Override
          public void handleMessage(Message msg)
          {
             if (msg.what == 1)
             {
                myTextView.setText("Start");
             }
             if (msg.what == 2)
             {
                myTextView.setText("It Worked!");
             }
             super.handleMessage(msg);
          }
       };
       
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
           //View referencing
           this.myTextView = (TextView)findViewById(R.id.myTextView);
           
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
           
            //Thread creation
            this.refreshThread = new Thread(new updateThread());
            this.refreshThread.start();
        }
       
        class updateThread implements Runnable{
           private int counter = 0;
           //@Override
           public void run()
           {
              while(!Thread.currentThread().isInterrupted())
              {
                 Message m = new Message();
                 if (this.counter == 1)
                 {
                    this.counter = 2;
                    m.what = this.counter;
                    threadTest.this.updateHandler.sendMessage(m);
                 }
                 if (this.counter == 0)
                 {
                    this.counter = 1;
                    m.what = this.counter;
                    threadTest.this.updateHandler.sendMessage(m);
                 }
     
                 try{
                    Thread.sleep(5000);
                 } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                 }
              }
           }
        }//End class updateThread
       
    }
As soon as I try to run it, I get a force close error. I checked my logcat, and here is what I got:

Code:
09-30 00:24:47.883: INFO/ActivityManager(71): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.thread.test/.threadTest }

09-30 00:24:48.543: WARN/ActivityManager(71): Activity pause timeout for HistoryRecord{43f9cf00 com.android.launcher/com.android.launcher2.Launcher}

09-30 00:24:48.783: INFO/ActivityManager(71): Start proc com.thread.test for activity com.thread.test/.threadTest: pid=250 uid=10039 gids={1015}

09-30 00:24:50.453: DEBUG/dalvikvm(71): GREF has increased to 301
09-30 00:24:50.483: DEBUG/AndroidRuntime(250): Shutting down VM
09-30 00:24:50.483: WARN/dalvikvm(250): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
09-30 00:24:50.552: ERROR/AndroidRuntime(250): FATAL EXCEPTION: main
09-30 00:24:50.552: ERROR/AndroidRuntime(250): java.lang.NullPointerException
09-30 00:24:50.552: ERROR/AndroidRuntime(250):     at com.thread.test.threadTest$1.handleMessage(threadTest.java:33)
09-30 00:24:50.552: ERROR/AndroidRuntime(250):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-30 00:24:50.552: ERROR/AndroidRuntime(250):     at android.os.Looper.loop(Looper.java:123)
09-30 00:24:50.552: ERROR/AndroidRuntime(250):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-30 00:24:50.552: ERROR/AndroidRuntime(250):     at java.lang.reflect.Method.invokeNative(Native Method)
09-30 00:24:50.552: ERROR/AndroidRuntime(250):     at java.lang.reflect.Method.invoke(Method.java:521)
09-30 00:24:50.552: ERROR/AndroidRuntime(250):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-30 00:24:50.552: ERROR/AndroidRuntime(250):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-30 00:24:50.552: ERROR/AndroidRuntime(250):     at dalvik.system.NativeStart.main(Native Method)
09-30 00:24:50.683: WARN/ActivityManager(71):   Force finishing activity com.thread.test/.threadTest
I've never seen any of this before, but here is my interpretation: It seems that the big problem is that there is an uncaught exception, and that exception is a java.lang.NullPointerException located somewhere in my handleMessage method.

I did some homework by looking around on this forum first, and found out that a java.lang.NullPointerException occurs when you try to access the fields or methods of an object that you haven't instantiated yet. handleMessage only uses msg.what and myTextView, and of the two, it seems more likely that I have messed something up with msg.what.

I'm trying to learn how all of this works, so if someone could just give me a few pointers or point me in the right direction or to a good resource, I would really appreciate it! :) Thank you for your time!
 
I found out my problem, and thought I would post the solution up so that it might help someone else someday. The problem, which I found through using the debugging tools, was that the reference variable myTextView was remaining null. That came form putting the line

this.myTextView = (TextView)findViewById(R.id.myTextView);

Before this line in the onCreate method:

setContentView(R.layout.main);

As soon as I moved it after that line, everything worked perfectly. Thanks for your help! :)
 
Back
Top Bottom