-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 回答
0

asynctask首先,如果没有可用的网络,您应该保护您的电话,例如:

if(isNetworkAvailable)
{
  new DownloadData().execute();
}else{
  //Show a toast that no network is available
}

然后在 asynctask 中,您应该检查s 是否为空,例如:

  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=");

    if(s!=null){
                    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();
                }
    }else{
     //Show a toast
    }
   return exResult;
    }

保护onPostExecute以及像:

if( exResult!=null || !exResult.equals("")){
 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);
        }
    }
}
于 2016-02-24T07:55:52.580 回答
0

如果未添加,则添加清单权限:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


     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 {
                  if(Helper.isConnectingToInternet(context)){

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

                      // Print message for No Internet Connection !

                  }

               }
           }
        });
    }

将此方法添加到您的实用程序类:

 /**
     * @param context
     * @return
     */
    public static boolean isConnectingToInternet(Context context) {
        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;
    }

希望它会帮助你!

于 2016-02-24T07:54:42.260 回答