掌握doInBackground(String ... params)

时间:2012-12-08 17:25:33

标签: android handler background-thread

在某种程度上,我确实理解了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;
    }

2 个答案:

答案 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