jacky
jacky

Reputation: 205

Android Handlers: msg.obj is null

I posted a similar version of this but it was under a different topic so I am reposting (I hope that is OK, if not please let me know).

Anyway, I can't get this to work for the life of me. I know it is probably something obvious but I just can't get it. I have been fighting this for hours. Hopefully somebody can help!

I am using Log.d to show what is stored int the Message and it is showing null. When I put it in the messageQueue, it has the data I expect. When I call obtainMessage from my handleMessage method, I get null. I have no idea why. I will be eternally grateful to anybody who can save me! Thanks!!!

Here is my code:

package jschuler.cs211d.hw07;

import android.app.Activity;
import android.os.Bundle;
import android.view.*;
import android.widget.*;
import android.os.Handler;
import android.content.Intent;
import android.os.Message;
import android.util.Log;
import android.app.Service;
import android.os.IBinder;

public class HW07 extends Activity implements View.OnKeyListener
{
    String howMany, upper, lower, values;
    TextView tv_howMany, tvUpper, tvLower, test;
    EditText howManyInput, upperInput, lowerInput;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv_howMany = (TextView) findViewById(R.id.how_many);
        tv_howMany.setText("How many primes would you like to generate?");

        howManyInput = (EditText) findViewById(R.id.input1);
        howManyInput.setOnKeyListener(this);        

        tvUpper = (TextView) findViewById(R.id.upper);
        tvUpper.setText("Upper limit:");

        upperInput = (EditText) findViewById(R.id.input2);
        upperInput.setOnKeyListener(this);        

        tvLower = (TextView) findViewById(R.id.lower);
        tvLower.setText("Lower limit:");

        lowerInput = (EditText) findViewById(R.id.input3);
        lowerInput.setOnKeyListener(this);        

        test = (TextView) findViewById(R.id.test);
    }

    Handler handler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            Log.d("handleMessage","message handled!");
            Toast.makeText(getApplicationContext(), "in handleMessage", Toast.LENGTH_LONG).show();
            String primes = msg.obj.toString();
            Log.d("handleMessage!","Here are the primes: " + primes);
            super.handleMessage(msg);

        }
    };

    public boolean onKey(View v, int keyCode, KeyEvent ke)
    {
        if( (ke.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER) )
        {
            values = howManyInput.getText().toString() + " " +
                upperInput.getText().toString() + " " +
                lowerInput.getText().toString();
            test.setText(values);

            Intent intent = new Intent(this, PrimeService.class);
            intent.putExtra("parameters",values);
            startService(intent);

            return true;
        }

        return false;
    }    
}

package jschuler.cs211d.hw07;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
import java.net.*;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.util.StringTokenizer;

public class PrimeService extends Service
{
    String str;

    int lower = 1, upper = 100;
    int numPrimes = 5;

    @Override
    public IBinder onBind(Intent args)
    {
        return null;
    }

    @Override
    public int onStartCommand(Intent i, int flags, int startId)
    {
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();

        String parameters = i.getExtras().getString("parameters");
        Log.d("onStartCommand","parameters: " + parameters);

        parseParameters(parameters);

        Thread t = new Thread( new Runnable() 
        {
            public void run() 
            {
                String result = generatePrimes();
                Log.d("result","result: "+result);
                Message primeMessage = receiveHandler.obtainMessage(0, result);
                receiveHandler.sendMessage(primeMessage);
                Log.d("primeMessage","primeMessage.toString(): "+ primeMessage.toString()); 
            }

        });
        t.start();

        return START_STICKY;
    }        

    Handler receiveHandler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            //SOMETHING IS WRONG HERE
            Message primeMsg = receiveHandler.obtainMessage();
            Log.d("primeMsg","primeMsg.toString(): "+ primeMsg.toString()); 

            String primes = (String)primeMsg.obj;

            Log.d("handleMessage","here are the primes: "+primes); 
        }
    };


    public void parseParameters(String p)
    {
        int i = 1;
        StringTokenizer st = new StringTokenizer(p);
        while (st.hasMoreTokens()) 
        {
            switch(i)
            {
                case 1: 
                    numPrimes = Integer.parseInt(st.nextToken());
                    break;
                case 2: 
                    upper = Integer.parseInt(st.nextToken());
                    break;
                case 3: 
                    lower = Integer.parseInt(st.nextToken());
                    break;
            }

            i++;
        }    %0

Upvotes: 0

Views: 2858

Answers (2)

Hoang
Hoang

Reputation: 101

Try this code in kotlin

var mHandler: Handler = object : Handler(Looper.getMainLooper()) {
    override fun handleMessage(msg: Message) {
        try {
            Log.i(
                TAG,
                "*** Callback " + msg.what
            )
            when (msg.what) {
            }
        } catch (ex: Exception) {
        }
    }
}

Upvotes: 0

jacky
jacky

Reputation: 205

I figured it out. It was obvious!!

Hopefully this will help somebody else.

This is what receiveHandler should look like:

Handler receiveHandler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {                        
        String primes = (String)msg.obj;

        Log.d("handleMessage","here are the primes: "+primes); 
    }
};

Upvotes: 3

Related Questions