0

在某种程度上,我确实了解处理程序,但我不确定如何处理参数以及如何让代码等到后台完成工作。我希望 UI 能够正常工作,并且我想在后台进行汇率计算。

我有以下内容:

我打电话new getOnlineExchangeRate().execute(""); //Get Exchange Rate in BG

之后我想要一个结果=amount*exchangerate,但代码不等待结果。有人能告诉我计算是如何等到我们有汇率的吗?我是否必须发送一些参数,看起来如何?

.
.
.
.
.
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;
    }
4

2 回答 2

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 处理了哪些信息类型。第一个是params的doInBackground(Params... ) 类型第二个是progress-Information的类型最后一个解释了返回的类型doInBackground(),所以它改变了method-header

protected Result doInBackground(Params... params){ };

to protected double doInBackground(Params... params){};

为了带回结果,我将使用 Observer oder Callback-Pattern。

编辑:将双精度更改为双精度,因为原语不能用于泛型。

于 2012-12-08T17:50:49.020 回答
1

代码不等待结果。有人能告诉我计算是如何等到我们有汇率的吗?我是否必须发送一些参数,看起来如何?

可以使用AsyncTask#get()强制代码等待,但这会阻塞主线程,直到 AsyncTask 完成,这违背了使用异步任务的目的。

最好将您的 Activity 设计为在没有汇率的情况下继续进行,就像我的邮件应用程序加载允许我在获取新邮件时撰写邮件和阅读旧邮件一样。当异步数据加载时,您可以使用新信息更新您的 UI。(我相信这就是你想要做的。)


要添加到 user1885518 代码,您应该使用 AsyncTask 作为 Activity 中的子类,如下所示:

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()你可以在你的活动中调用任何你想要的方法来计算result=amount*exchangerate和显示result任何合适的地方。

于 2012-12-08T17:57:34.480 回答