Pergunta

I have all the necessary imports. If anyone could throw some light on perhaps why my InputStream is not being read that would be greatly appreciated. I believe it is this as my log returns a problem with the async class, but further in from that it seems to be (I could be wrong though) that the input stream is not being read as the given url. Thanks in advance.

public class MainActivity extends Activity {

String[] currency;
EditText amount1;
TextView answer;
Spinner spin1;
Spinner spin2;

private InputStream OpenHttpConnection(String urlString) throws IOException
{
    InputStream in = null;

    int response = -1;

    URL url = new URL(urlString);
    URLConnection conn = url.openConnection();

    if(!(conn instanceof HttpURLConnection))
        throw new IOException("Not an HTTP Connection");
    try
    {
        HttpURLConnection httpConn = (HttpURLConnection) conn;
        httpConn.setAllowUserInteraction(false);
        httpConn.setInstanceFollowRedirects(true);
        httpConn.setRequestMethod("GET");
        httpConn.connect();
        response = httpConn.getResponseCode();
        if(response == HttpURLConnection.HTTP_OK)
        {
            in = httpConn.getInputStream();
        }

    }
    catch(Exception ex)
    {
        Log.d("Wolf Post", ex.getLocalizedMessage());
        throw new IOException("Error Connecting");
    }
    return in;
}

//method to send information and pull back xml format response
private String wolframAnswer(int currencyVal, String firstSelect, String secondSelect)
{
    //variables are assigned based of user select
    int pos1 = spin1.getSelectedItemPosition();
    firstSelect = currency[pos1];

    int pos2 = spin2.getSelectedItemPosition();
    secondSelect = currency[pos2];

    amount1 = (EditText)findViewById(R.id.editAmount1);
    answer = (TextView)findViewById(R.id.txtResult);

    InputStream in = null;

    String strWolfReturn = "";

    try
    {
        in = OpenHttpConnection("http://www.wolframalpha.com/v2/input="+currencyVal+firstSelect+"-"+secondSelect+"&appid=J6HA6V-YHRLHJ8A8Q");
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db;

        try
        {
            db = dbf.newDocumentBuilder();
            doc = db.parse(in);
        }
        catch(ParserConfigurationException e)
        {
            e.printStackTrace();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        doc.getDocumentElement().normalize();

        //retrieve the wolfram assumptions
        NodeList assumpElements = doc.getElementsByTagName("assumptions");

        //move through assumptions to correct one
        for (int i = 0; i < assumpElements.getLength(); i++)
        {
            Node itemNode = assumpElements.item(i);

            if(itemNode.getNodeType() == Node.ELEMENT_NODE)
            {
                //convert assumption to element
                Element assumpElly = (Element) itemNode;

                //get all the <query> elements under the <assumption> element
                NodeList wolframReturnVal = (assumpElly).getElementsByTagName("query");

                strWolfReturn = "";

                //iterate through each <query> element
                for(int j = 0; j < wolframReturnVal.getLength(); j++)
                {
                    //convert query node into an element
                    Element wolframElementVal = (Element)wolframReturnVal.item(j);

                    //get all child nodes under query element
                    NodeList textNodes = ((Node)wolframElementVal).getChildNodes();

                    strWolfReturn += ((Node)textNodes.item(0)).getNodeValue() + ". \n";
                }
            }

        }



    }
    catch(IOException io)
    {
        Log.d("Network activity", io.getLocalizedMessage());
    }

    return strWolfReturn;
}
//using async class to run a task similtaneously with the app without crashing it
private class AccessWebServiceTask extends AsyncTask<String, Void, String>
{
    protected String doInBackground(String... urls)
    {
        return wolframAnswer(100, "ZAR", "DOL");
    }
    protected void onPostExecute(String result)
    {
        Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show();
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //spinner implementation from here down
    currency = getResources().getStringArray(R.array.currencies);

    spin1 = (Spinner)findViewById(R.id.spinCurr1);
    spin2 = (Spinner)findViewById(R.id.spinCurr2);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, currency);

    spin1.setAdapter(adapter);
    spin2.setAdapter(adapter);

    //using httpget to send request to server.
    amount1 = (EditText)findViewById(R.id.editAmount1);
    answer = (TextView)findViewById(R.id.txtResult);

    Button convert = (Button)findViewById(R.id.btnConvert);

    convert.setOnClickListener(new Button.OnClickListener()
    {
        public void onClick(View v)
        {
            //apiSend();
            new AccessWebServiceTask().execute();
        }

    });


}

/*public void apiSend()
{
    int pos1 = spin1.getSelectedItemPosition();
    String firstSelect = currency[pos1];

    int pos2 = spin2.getSelectedItemPosition();
    String secondSelect = currency[pos2];

    amount1 = (EditText)findViewById(R.id.editAmount1);
    answer = (TextView)findViewById(R.id.txtResult);

    Toast.makeText(getBaseContext(), "Converting...", Toast.LENGTH_LONG).show();

    try
    {
        //encoding of url data
        String currencyVal = URLEncoder.encode(amount1.getText().toString(),"UTF-8");

        //object for sending request to server
         HttpClient client = new DefaultHttpClient();

         String url = "http://www.wolframalpha.com/v2/input="+currencyVal+firstSelect+"-"+secondSelect+"&appid=J6HA6V-YHRLHJ8A8Q";

         try
         {

             String serverString = "";

             HttpGet getRequest = new HttpGet(url);

             ResponseHandler<String> response = new BasicResponseHandler();

             serverString = client.execute(getRequest, response);
             Toast.makeText(getBaseContext(), "work 1work 1work", Toast.LENGTH_SHORT).show();
             answer.setText(serverString);
         }
         catch(Exception ex)
         {
             answer.setText("Fail 1");
         }
    }
    catch(UnsupportedEncodingException ex)
    {
        answer.setText("Fail 2");
    }

}*/

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

Foi útil?

Solução

I suspect the problem is that you're not getting a good connection.

if(response == HttpURLConnection.HTTP_OK)
{
    in = httpConn.getInputStream();
}

At this point in the code you're setting the input stream, but if the result is not HTTP_OK, you're going to return null, and you're not handling that possibility correctly, neither in OpenHttpConnection() nor in wolframAnswer() where you call it. It seems something in your connection setup code is not correctly connecting, and thus your input stream is null and crashing when you try to parse it with the DocumentBuilder.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top