-1

Yahoo Finance API を使用して、通貨データを Android アプリにフェッチしています。コンバーターアプリを開発しています。私の問題は、接続がない場合、アプリが強制停止またはクラッシュすることです。つまり、何らかの例外が発生しますが、それらの例外を処理するコードを配置できません。やってみましたが失敗しました。皆さんに助けてもらいます。これが以下のコードです-

 public void Currency() {
    spin_currency = (Spinner) findViewById(R.id.myspin);
    toSpin_currency = (Spinner) findViewById(R.id.myspin1);

    ArrayAdapter<CharSequence> adapterC = ArrayAdapter.createFromResource(this, R.array.name,
            android.R.layout.simple_spinner_item);
    adapterC.setDropDownViewResource(android.R.layout.select_dialog_singlechoice);
    spin_currency.setAdapter(adapterC);
    toSpin_currency.setAdapter(adapterC);
    spin_currency.setOnItemSelectedListener(new spinOne(1));
    toSpin_currency.setOnItemSelectedListener(new spinOne(2));
    btnConv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           /* if (etInput.getText().toString().trim().length() > 0) {
                double cur = Double.parseDouble(etInput.getText().toString()); */
            if (from == to) {
                Toast.makeText(getApplicationContext(), "Invalid conversion", Toast.LENGTH_LONG).show();
                etOutput.setText(null);
            } else {

                    new DownloadData().execute();
                }
       }
    });
}

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();
}

class DownloadData extends AsyncTask<Void, Integer, String> {
    ProgressDialog pd = null;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pd = new ProgressDialog(Temperature.this);
        pd.setTitle("Converting...");
        pd.setMessage("Please wait...");
        pd.setCancelable(false);
        pd.show();
    }

    @Override
    protected String doInBackground(Void... params) {
        String s;
        String exResult = "";
        final String val[];
        val  = getResources().getStringArray(R.array.value);
            try {
                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);
                exResult = jObj.getJSONObject("query").getJSONObject("results").getJSONObject("rate").getString("Rate");

                System.out.println(exResult);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        return exResult;
    }
    @Override
    protected void onPostExecute(String exResult) {
        super.onPostExecute(exResult);
        pd.dismiss();

        System.out.println("theResult:" + exResult);
        if(etInput.getText().toString().trim().length() > 0 ){
            if (etInput.getText().toString().equals(".") || etInput.getText().toString().equals("-.") || etInput.getText().toString().equals("-")) {
                Toast.makeText(getApplicationContext(), "Please enter a valid value", Toast.LENGTH_LONG).show();
            } else {
                Double cur = Double.parseDouble(etInput.getText().toString());
                etOutput.setText(String.valueOf(Double.parseDouble(exResult) * cur));
            }
        } else {
            Toast.makeText(getApplicationContext(), "Please enter a valid value", Toast.LENGTH_LONG).show();
            etOutput.setText(null);
        }
    }
}
private class spinOne implements OnItemSelectedListener {
    int ide;

    spinOne(int i) {
        ide = i;
    }

    public void onItemSelected(AdapterView<?> parent, View view,
                               int index, long id) {
        if (ide == 1)
            from = index;
        else if (ide == 2)
            to = index;

    }

    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub
    }
}
4

3 に答える 3

1

アプリにチェックを実装したら、インターネット接続があるかどうかを確認しました。これを見て、これを実装するかどうかを決定できます。

public class ConnectionDetector {

private Context context;

public ConnectionDetector(Context cont){
    this.context = cont;
}

public boolean isConnectingToInternet(){
    ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivity != null)
    {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }

    }
    return false;
}
}

このクラスのオブジェクトは、OnCreate メソッドで初期化できます。

最後に、AsyncTask をトリガーする直前に、このクラスのメソッドを呼び出します。

Boolean isInternetConnected = cd.isConnectingToInternet();
if (isInternetConnected)
{
   //execute AsyncTask here.
}

お役に立てれば。

于 2016-02-24T07:59:27.230 に答える