EightBitSpade
Lurker
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:
As soon as I try to run it, I get a force close error. I checked my logcat, and here is what I got:
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!
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
}
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 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!