0

I am trying to use walfram alpha in my app I already got my code working in a java project but when I'm trying to use it in android I'm getting "Exception downloading URL"

Here is my code

public class AlphaAPISample extends Activity{

// PUT YOUR APPID HERE:
private static String appid = MYAPPID;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String input = "who is the president";
    WAEngine engine = new WAEngine();
    engine.setAppID(appid);
    engine.addFormat("plaintext");
    WAQuery query = engine.createQuery();
    query.setInput(input);
    try {
        System.out.println("Query URL:");
        System.out.println(engine.toURL(query));
        WAQueryResult queryResult = engine.performQuery(query);

        if (queryResult.isError()) {
            System.out.println("Query error");
            System.out.println("  error code: " + queryResult.getErrorCode());
            System.out.println("  error message: " + queryResult.getErrorMessage());

        } else if (!queryResult.isSuccess()) {
            System.out.println("Query was not understood; no results available.");

        } else {

            // Got a result.
            System.out.println("Successful query. Pods follow:\n");
            for (WAPod pod : queryResult.getPods()) {
                if (!pod.isError()) {
                    if(pod.getTitle().equals("Result")) {
                        System.out.println(pod.getTitle());
                        for (WASubpod subpod : pod.getSubpods()) {
                            for (Object element : subpod.getContents()) {
                                if (element instanceof WAPlainText) {
                                    System.out.println(((WAPlainText) element).getText());
                                }
                            }
                        }
                    }
                }
            }
            // We ignored many other types of Wolfram|Alpha output, such as warnings, assumptions, etc.
            // These can be obtained by methods of WAQueryResult or objects deeper in the hierarchy.
        }
    } catch (WAException e) {
        e.printStackTrace();
    }


   }
}

Here is my log cat

    07-21 05:13:23.276  30688-30688/com.assist.me I/System.out﹕ Query URL:
07-21 05:13:23.276  30688-30688/com.assist.me I/System.out﹕ http://api.wolframalpha.com/v2/query?appid=MYAPPID&input=who+is+the+president&format=plaintext&async=false&reinterpret=true
07-21 05:13:23.276  30688-30688/com.assist.me I/URLFetcher﹕ Downloading url http://api.wolframalpha.com/v2/query?appid=MYAPPID&input=who+is+the+president&format=plaintext&async=false&reinterpret=true
07-21 05:13:23.286  30688-30688/com.assist.me W/URLFetcher﹕ Exception downloading URL http://api.wolframalpha.com/v2/query?appid=MYAPPID&input=who+is+the+president&format=plaintext&async=false&reinterpret=true. com.wolfram.alpha.net.WAHttpException: android.os.NetworkOnMainThreadException
07-21 05:13:23.286  30688-30688/com.assist.me I/URLFetcher﹕ Finished downloading URL http://api.wolframalpha.com/v2/query?appid=MYAPPID&input=who+is+the+president&format=plaintext&async=false&reinterpret=true. Elapsed millis: 8
07-21 05:13:23.286  30688-30688/com.assist.me W/System.err﹕ com.wolfram.alpha.WAException: com.wolfram.alpha.net.WAHttpException: android.os.NetworkOnMainThreadException
07-21 05:13:23.286  30688-30688/com.assist.me W/System.err﹕ at com.wolfram.alpha.WAEngine.performQuery(WAEngine.java:128)
07-21 05:13:23.286  30688-30688/com.assist.me W/System.err﹕ at com.pin.assistme.AlphaAPISample.onCreate(AlphaAPISample.java:83)

Every place in the code with my app id was replaced with the phrase "MYAPPID"

Solved:

The problem was I tried to obtain internet data from the main thread when I should have use an AsyncTask as you can see in the exception

android.os.NetworkOnMainThreadException

See code below for right way of doing this.

user3068269
  • 137
  • 1
  • 13

1 Answers1

1

Ok I figured that out!

public class AlphaAPISample extends Activity {

// PUT YOUR APPID HERE:
private static String appid = "APPID";

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    new YourTask().execute();
}


WAQueryResult queryResult;

private class YourTask extends AsyncTask<WAQueryResult, Void, WAQueryResult> {


    protected void onPreExecute() {

    }

    @Override
    protected WAQueryResult doInBackground(WAQueryResult... urls) {
        String input = "who is the president";
        WAEngine engine = new WAEngine();
        engine.setAppID(appid);
        engine.addFormat("plaintext");

        // Create the query.
        WAQuery query = engine.createQuery();
        query.setInput(input);
        queryResult = null;
        try {
            queryResult = engine.performQuery(query);
        } catch (WAException e) {
            e.printStackTrace();
        }
        return queryResult;
    }

    @Override
    protected void onPostExecute(WAQueryResult response) {
        if (queryResult.isError()) {
            System.out.println("Query error");
            System.out.println("  error code: " + queryResult.getErrorCode());
            System.out.println("  error message: " + queryResult.getErrorMessage());

        } else if (!queryResult.isSuccess()) {
            System.out.println("Query was not understood; no results available.");

        } else {

            // Got a result.
            System.out.println("Successful query. Pods follow:\n");
            for (WAPod pod : queryResult.getPods()) {
                if (!pod.isError()) {
                    if (pod.getTitle().equals("Result")) {
                        System.out.println(pod.getTitle());
                        for (WASubpod subpod : pod.getSubpods()) {
                            for (Object element : subpod.getContents()) {
                                if (element instanceof WAPlainText) {
                                    System.out.println(((WAPlainText) element).getText());
                                    Toast.makeText(getApplicationContext(),((WAPlainText) element).getText(),Toast.LENGTH_SHORT).show();
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

}

user3068269
  • 137
  • 1
  • 13
  • 1
    Would you mind making some notes as to what exactly was wrong, and how you fixed it? In case people referencing this in the future don't immediately notice your problem was a `NetworkOnMainThreadException`. – Mike M. Jul 21 '14 at 04:16