2012-05-24 2 views
0

Я опубликовал аналогичную версию этого, но это было под другой темой, поэтому я переношу (я надеюсь, что все в порядке, если не сообщите мне об этом).Андроид: msg.obj is null

Во всяком случае, я не могу заставить это работать на жизнь меня. Я знаю, что это, вероятно, что-то очевидное, но я просто не могу это понять. Я боролся с этим часами. Надеюсь, кто-то может помочь!

Я использую Log.d, чтобы показать, что хранится в сообщении, и отображает нуль. Когда я помещаю его в messageQueue, у него есть данные, которые я ожидаю. Когда я вызываю getMessage из моего метода handleMessage, я получаю null. Понятия не имею почему. Я буду вечно благодарен всем, кто может спасти меня! Благодаря!!!

Вот мой код:

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 

ответ

1

Я понял это. Это было очевидно!

Надеюсь, это поможет кому-то еще.

Это то, что receiveHandler должен выглядеть следующим образом:

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

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