0

何らかの方法でハンドラーを理解していますが、パラメーターをどうするか、バックグラウンドでジョブが完了するまでコードを待機させる方法がわかりません。UI を正常に動作させたいのですが、バックグラウンドで為替レートの計算を行いたいと考えています。

私は次のものを持っています:

電話するnew getOnlineExchangeRate().execute(""); //Get Exchange Rate in BG

その後、result=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;

nullではなくgetYahooExchangeRateの結果を返したいので、これを変更すると、戻り値はdoubleになります。したがって、これを次のように変更します。

@Override
protected Double doInBackground(String... params){
    return getYahooExchangeRate(USDEUR);
}

クラスヘッダーも変更する必要があります。

public class getOnlineExchangeRate extends AsyncTask<String, Void, Double> {


AsyncTask<Params, Progress, Result>

汎用部分は、どのInformationstypesが処理されるかをAsyncTaskに通知します。最初はのパラメータのタイプですdoInBackground(Params... ) 2番目は進行状況のタイプです-情報最後はどのタイプが返されるかを説明するdoInBackground()ので、メソッドヘッダーをから変更します

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

保護されたdoubledoInBackground(Params ... params){};

結果を戻すために、私が使用するのは、Callback-Patternのオブザーバーです。

編集:プリミティブはジェネリックに使用できないため、doubleをDoubleに変更しました。

于 2012-12-08T17:50:49.020 に答える
1

コードは結果を待っていません。為替レートが得られるまで計算がどのように待機するか教えてもらえますか? いくつかのパラメーターを送信する必要がありますか?それはどのように見えますか?

コードを強制的に待機させるために使用できますAsyncTask#get()が、これは AsyncTask が完了するまでメイン スレッドをブロックし、非同期タスクを使用する目的に反します。

為替レートなしで続行するようにアクティビティを設計することをお勧めします。これは、メール アプリが読み込まれてメッセージを作成し、新しいメッセージがフェッチされている間に古いメッセージを読むことができるようにするためです。非同期データが読み込まれると、UI を新しい情報で更新できます。(これがあなたがやろうとしていることだと思います。)


user1885518 コードに追加するには、次のように 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できます。

于 2012-12-08T17:57:34.480 に答える