2012-05-24 25 views
0

我發佈了一個類似的版本,但它是在不同的主題下,所以我正在重新發布(我希望沒問題,如果不是,請讓我知道)。Android處理程序:msg.obj爲null

無論如何,我無法得到這個爲我的生活工作。我知道這可能是明顯的,但我無法得到它。我一直在打這幾個小時。希望有人能幫助!

我正在使用Log.d來顯示消息中存儲的內容,它顯示爲空。當我把它放在messageQueue中時,它有我期望的數據。當我從我的handleMessage方法調用obtainMessage時,我得到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); 
    } 
};