Java 在doInBackground方法中发生的异步任务#1
我想不出办法来确保所有的信息都给出了,然后列出我的三个班级。然而,在所有这些之前,我将包括我的logcat错误和我的应用程序应该做什么: Logcat错误 应用程序应该: 用户在EditText字段中输入一个值,然后从2个微调器中选择基础货币和要转换的货币,然后按下convert按钮并输出新货币。我正在尝试使用异步任务来完成这一任务,并希望学习如何更好地理解和使用它们 课程: 我将列出我的课程,看看这是否能更好地说明我的情况。我将省略我的进口等,以减少在这方面的职位,如果他们是需要的只是让我知道 MainActivity.java FindRate.java 澄清 应用程序在点击convert按钮时崩溃,只是为了确保完全清楚。我做错了什么 变化Java 在doInBackground方法中发生的异步任务#1,java,android,android-asynctask,gson,Java,Android,Android Asynctask,Gson,我想不出办法来确保所有的信息都给出了,然后列出我的三个班级。然而,在所有这些之前,我将包括我的logcat错误和我的应用程序应该做什么: Logcat错误 应用程序应该: 用户在EditText字段中输入一个值,然后从2个微调器中选择基础货币和要转换的货币,然后按下convert按钮并输出新货币。我正在尝试使用异步任务来完成这一任务,并希望学习如何更好地理解和使用它们 课程: 我将列出我的课程,看看这是否能更好地说明我的情况。我将省略我的进口等,以减少在这方面的职位,如果他们是需要的只是让我知道
finally {
scanner.close();
connectStat.disconnect();
}
到
我猜在扫描程序初始化之前会抛出一个异常,因此会得到一个空指针异常。黄金法则,始终检查空值好的,
扫描器
保持空值,因为它可能不会初始化它,因为异常被抛出,它最终进入并尝试对空对象调用close()
。在尝试关闭扫描器之前,应该检查扫描器是否为空。原因是它为null并抛出一个错误,您可以调试您知道的doInBackground块@vucko我可以用什么不同的方法使其初始化?我想我明白你的意思了。一个家伙接受了评论,并在下面给出了答案,试试看。所以,我尝试了一下,但没有任何运气,我仍然得到了异步任务1的致命异常。发布新的StackTrace这会解决它的。我只是忘了将internet权限添加到清单中。谢谢你的帮助!
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener{
public static double sum;
private static String urlIO = "http://api.fixer.io/latest?base=";
Spinner spinner, spinner2;
Button convBtn, aboutBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final EditText enteredAmt = (EditText)findViewById(R.id.editText);
final TextView result = (TextView)findViewById(R.id.resultTv);
spinner = (Spinner) findViewById(R.id.spinner);
spinner2 = (Spinner) findViewById(R.id.spinner2);
convBtn = (Button) findViewById(R.id.button);
aboutBtn = (Button) findViewById(R.id.button2);
ArrayAdapter adapter = ArrayAdapter.createFromResource(this, R.array.currencyTypes, android.R.layout.simple_spinner_item);
spinner.setAdapter(adapter);
spinner2.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
spinner2.setOnItemSelectedListener(this);
convBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FindRate covertMe = new FindRate(result);
sum = Double.parseDouble(enteredAmt.getText().toString());
try{
if(spinner.getSelectedItem().toString().equals("USD") && spinner2.getSelectedItem().toString().equals("EUR")){
covertMe.execute(new URL(urlIO + "USD&symbols=GBP"));
}
} catch (MalformedURLException e){
e.printStackTrace();
}
}
});
aboutBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getBaseContext(), "By: Austin Mauldin \n ITEC 4550", Toast.LENGTH_SHORT).show();
}
});
}
public class FindRate extends AsyncTask<URL, Void, Double> {
private static final String rightForm = "###.00";
private static final String errorCode = "error code: it messed up";
private static final String checkRSP = "Checking";
private TextView tV;
private Gson gSON;
FindRate(TextView inp){
tV = inp;
gSON = new GsonBuilder().create();
}
@Override
protected Double doInBackground(URL... params) {
HttpURLConnection connectStat = null;
Scanner scanner = null;
StringBuilder myJsonString = new StringBuilder();
try {
if (params.length != 1)
throw new IllegalArgumentException(this.getClass().getName() + errorCode);
connectStat = (HttpURLConnection) params[0].openConnection();
InputStream inputer = new BufferedInputStream(connectStat.getInputStream());
scanner = new Scanner(inputer);
while (scanner.hasNext()) myJsonString.append(scanner.nextLine());
Log.v(checkRSP, "Response(" + connectStat.getResponseCode() + "):" +
connectStat.getResponseMessage());
} catch (IOException e){
Log.e(checkRSP, e.getStackTrace().toString());
return Double.valueOf(-1D);
} finally {
scanner.close();
connectStat.disconnect();
}
String jSon = myJsonString.toString();
LookupRate cuRate = gSON.fromJson(jSon, LookupRate.class);
Log.v(checkRSP, jSon);
Log.v(checkRSP, cuRate.toString());
return Double.valueOf(cuRate.findRate());
}
@Override
protected void onPostExecute(Double result){
DecimalFormat format = new DecimalFormat(rightForm);
String str = format.format(result);
tV.setText(format.format(MainActivity.sum * Double.parseDouble(str))+ "");
}
}
public class LookupRate {
private String to;
private Double rate;
private String from;
public Double findRate() {
return rate;
}
@Override
public String toString(){
String str1 = "Checking" +
" [rates=" + rate + "]";
return str1;
}
}
finally {
scanner.close();
connectStat.disconnect();
}
finally {
if(null != scanner){ scanner.close();}
if(null != connectStat){ connectStat.disconnect();}
}