在某种程度上,我确实理解了Handler,但我不知道如何处理params以及如何让代码等到后台完成工作。我希望用户界面正常工作,我希望在后台进行汇率计算。
我有以下内容:
我致电new getOnlineExchangeRate().execute(""); //Get Exchange Rate in BG
之后我想得到一个结果=金额*交换,但代码不等待结果。 有人可以告诉我计算如何等到我们进行交换。我是否必须发送一些参数,这看起来如何?
.
.
.
.
.
public double getYahooExchangeRate(String ER){
double exchangerate=0;
try {
s = getJson("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22"+ER+"%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=");
//s = getJson("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22"+val[from]+val[to]+"%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=");
JSONObject jObj;
jObj = new JSONObject(s);
String exResult = jObj.getJSONObject("query").getJSONObject("results").getJSONObject("rate").getString("Rate");
exchangerate=Double.parseDouble(exResult);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ALS.Toast(myContext.getString(R.string.conversionerror), false);
}
catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ALS.Toast(myContext.getString(R.string.conversionerror), false);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ALS.Toast(myContext.getString(R.string.conversionerror), false);
}
return exchangerate;
}
public String getJson(String url)throws ClientProtocolException, IOException {
StringBuilder build = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String con;
while ((con = reader.readLine()) != null) {
build.append(con);
}
return build.toString();
}
public class getOnlineExchangeRate extends AsyncTask<String, Void, String> {
@Override
protected void onPostExecute(String result) {
// execution of result of Long time consuming operation
ALS.Toast(myContext.getString(R.string.exchangeratesupdated), true);
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
// perform long running operation operation
getYahooExchangeRate(USDEUR);
return null;
}
答案 0 :(得分:2)
我认为你的问题就在这一行:
@Override
protected String doInBackground(String... params) {
getYahooExchangeRate(USDEUR);
return null;
你想要返回getYahooExchangeRate的结果而不是null :) 所以改变它,返回值应该是双倍的。所以改成这个:
@Override
protected Double doInBackground(String... params){
return getYahooExchangeRate(USDEUR);
}
您还必须更改班级标题:
public class getOnlineExchangeRate extends AsyncTask<String, Void, Double> {
AsyncTask<Params, Progress, Result>
通用部分告诉AsyncTask处理哪些Informationstypes。
第一个是doInBackground(Params... )
的参数的类型
第二个是进度信息的类型
最后一个解释了doInBackground()
返回的类型,因此它更改了
protected Result doInBackground(Params... params){ };
要 protected double doInBackground(Params ... params){};
带回我将使用的结果和Observer oder Callback-Pattern。
编辑:将double更改为Double,因为基元不能用于泛型。
答案 1 :(得分:1)
代码不等待结果。有人可以告诉我计算如何等到我们进行交换。我是否必须发送一些参数,这看起来如何?
你可以使用AsyncTask#get()
强制代码等待,但是这会阻塞主线程直到AsyncTask完成,这违背了使用异步任务的目的。
最好将您的活动设计为在没有汇率的情况下继续进行,就像我的邮件应用程序加载一样,允许我在获取新邮件时撰写邮件和阅读旧邮件。加载异步数据后,您可以使用新信息更新UI。 (我相信这是你要做的。)
要添加到user1885518代码,您应该在您的Activity中使用AsyncTask作为子类,如下所示:
public class MainActivity extends Activity {
private class getOnlineExchangeRate extends AsyncTask<Void, Void, Double> {
@Override
protected Double doInBackground(Void... params) {
return getYahooExchangeRate(params[0]);
}
@Override
protected void onPostExecute(Double rate) {
// Do something with rate
}
}
...
}
一旦您知道您想要的汇率,请致电:
new getOnlineExchangeRate().execute(USDEUR); //Get Exchange Rate in BG
现在,当您从在线获得费率时,代码会以您所需的费率调用onPostExecute()
。在onPostExceute()
内,您可以在ACtivity中调用您想要的任何方法来计算result=amount*exchangerate
并在适当的位置显示result
。