有人可以帮助我使用Runnable。我已经尝试了3种不同的方法来解决这个问题,但我似乎仍然无法弄明白

时间:2014-08-29 03:51:56

标签: multithreading handler runnable

我的问题在于onClick方法。我似乎无法弄清楚如何正确构建一个正在运行的Runnable / Thread / Handler。

package sed.jeff.conversion;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends Activity 
{
    private static final String TAG = "MainActivity";

    Button btConvert;
    EditText etInitialValue;
    TextView tvAnswer;
    Spinner spInitialType, spFinalType;
    int mInitialValue, mInitialType, mFinalValue, mFinalType, mRegion = 0;
    Distance D1; 
    Handler handler;
    Runnable r;

    //initialization
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        Log.i(TAG, "entered onCreate()");

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btConvert = (Button)findViewById(R.id.btnConvert);
        etInitialValue = (EditText)findViewById(R.id.etInitialValue);
        spInitialType = (Spinner)findViewById(R.id.spInitialType);
        spFinalType = (Spinner)findViewById(R.id.spFinalType);
        D1 = new Distance();


    }

    //implementation
    protected void onStart()
    {
        Log.i(TAG, "entered onStart()");
        super.onStart();
        spInitialType.setOnItemSelectedListener(new OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
            {
                // TODO Auto-generated method stub
                Log.i(TAG, "Initial Type position 1: " + position);
                mInitialType = position;
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) 
            {
                // TODO Auto-generated method stub

            }           
        });

        spFinalType.setOnItemSelectedListener(new OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
            {
                // TODO Auto-generated method stub
                Log.i(TAG, "Initial Type position 2: " + position);
                mFinalType = position;
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) 
            {
                // TODO Auto-generated method stub

            }           
        });

        btConvert.setOnClickListener(new View.OnClickListener()
        {                                   
            @Override
            public void onClick(View v) 
            {
                // TODO Auto-generated method stub
                Log.i(TAG, "entered onClick()");

                handler = new Handler();
                r = new Runnable()
                {
                    @Override
                    public void run()
                    {                       
                        tvAnswer.setText(D1.getAnswer(mRegion, mInitialType, mFinalType, Double.parseDouble(etInitialValue.getText().toString())));
                        handler.post(this);
                    }
                };
                handler.post(r);
            }   
        });
    }
}

这是我用来进行转换的类。目前唯一重要的方法是没有输入的构造函数和String getAnswer()方法。

package sed.jeff.conversion;


public class Distance 
{
    double league, mile, yard, feet, inch, line, thou;
    double decameter, hectometer, kilometer, megameter, meter, decimeter, centermeter, micrometer;
    double fathom, nauticalMile;
    double chain, rod;
    double furlong, horseLength;
    double hubbleLength, parsec, lightYear, astronomicalUnit;

    /*(
    private static double[] THOU = {1, 83.333333, 1000, 12000, 36000, 63360000, 190080000};
    private static double[] LINE = {.012, 1, 12, 144, 432, 760320, 2280960};
    private static double[] INCH = {.001, .083333, 1, 12, 36, 63360, 190080};
    private static double[] FOOT = {.000083, .006944, .083333, 1, 3, 5280,  15840};
    private static double[] YARD = {.000028, .002315, .027778, .333333, 1, 1760, 5280};
    private static double[] MILE = {.00000001578, .000001315, .0000157828, .00018939, .0005681818, 1, 3};
    private static double[] LEAGUE = {.00000000526, .00000043841, .00000526094, .00006313131, .0001893939, .33333333, 1};
    */

    private static double[][] CONVERSION_USA = {{1,            83.333333,    1000,         12000,        36000,       63360000,  190080000}, 
                                                {.012,         1,            12,           144,          432,         760320,    2280960},
                                                {.001,         .083333,      1,            12,           36,          63360,     190080},
                                                {.000083,      .006944,      .083333,      1,            3,           5280,      15840},
                                                {.000028,      .002315,      .027778,      .333333,      1,           1760,      5280},
                                                {.00000001578, .000001315,   .0000157828,  .00018939,    .0005681818, 1,         3},
                                                {.00000000526, .00000043841, .00000526094, .00006313131, .0001893939, .33333333, 1}
                                               };
    public double[] answer;


    public Distance()
    {
        answer = new double[7];
    }

    public Distance(int type, int initialMeasurement, double value)
    {
        answer = new double[7];

        switch(type)
        {
            case 0:
                uSMeasurments(initialMeasurement, value);
                break;
        }   
    }   

    private void uSMeasurments(int initialType, double value)
    {       
        for(int i = 0; i < 7; i++ )
        {
            answer[i] = CONVERSION_USA[initialType][i] * value;
        }
    }

    public String getAnswer(int region, int initialType, int finalType, double value)
    {
        String answer = null;
        switch(region)
        {
            case 0:
                answer = Double.toString(CONVERSION_USA[initialType][finalType] * value);
                break;              
        }
        return answer;      
    }

    public String toString()
    {
        String finalAnswer = "";
        for(int i = 0; i < 7; i++ )
        {
            finalAnswer += answer[i] + " ";
        }
        return finalAnswer;     
    }   
}

1 个答案:

答案 0 :(得分:3)

在这种情况下,我认为你不需要使用处理程序。

否则,正确的方法是在这些方面做点什么:

Runnable r=new Runnable() {

   @Override
   public void run() {
      tvAnswer.setText(D1.getAnswer(mRegion, mInitialType, mFinalType,       Double.parseDouble(etInitialValue.getText().toString())));

   }
  };

  handler.post(r);