我的问题在于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;
}
}
答案 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);