0

これと同様のバージョンを投稿しましたが、別のトピックの下にあったため、再投稿します (問題ないことを願っています。そうでない場合はお知らせください)。

とにかく、私はこれを私の人生で機能させることはできません。私はそれがおそらく明らかなことだと知っていますが、私はそれを得ることができません。私は何時間もこれと戦ってきました。うまくいけば、誰かが助けてくれるでしょう!

Log.d を使用して Message に格納されているものを表示していますが、null が表示されています。それを 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
4

1 に答える 1

2

私はそれを考え出した。一目瞭然でした!!

うまくいけば、これは他の誰かを助けるでしょう。

receiveHandler は次のようになります。

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

        Log.d("handleMessage","here are the primes: "+primes); 
    }
};
于 2012-05-24T23:42:12.623 に答える