4

I am using below code. It is giving error in Android Studio. Can you please help. As per my understanding the args[0] does not getting populated with some value. Why is that? if args[0] is not picking any value the any other implementation for this.

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.renderscript.Element;
import android.util.Log;
import android.widget.TextView;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.ElementType;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

public class StockInfoActivity  extends Activity{
    private static final String TAG="StockQoute";

    static final String KEY_ITEM="quote";
    static final String KEY_YEAR_LOW="YearLow";
    static final String KEY_YEAR_HIGH="YearHigh";
    static final String KEY_DAYS_LOW="DaysLow";
    static final String KEY_DAYS_HIGH="DaysHigh";
    static final String KEY_CHANGE="Change";
    static final String KEY_LAST_TRADE="LastTradePriceOnly";
    static final String KEY_DAYS_CHANGE="DaysRange";

    TextView companyNameView;
    TextView yearLowView    ;
    TextView yearHighView   ;
    TextView daysLowView    ;
    TextView daysHighView   ;
    TextView LastPriceView  ;
    TextView changeView     ;
    TextView dailyPriceRangeView;

    String name="";
    String yearLow="";
    String yearHigh="";
    String daysLow="";
    String daysHigh="";
    String lastTradePrice="";
    String change="";
    String daysRange="";

    String yahooURLFirst="https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quote%20where%20symbol%20in%20(%22";
    String yahooURLSecond="%22)&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";

    protected void onCreate (Bundle savedInstanceState){

        super.onCreate(savedInstanceState);
        setContentView(R.layout.get_stock_qoute);
        Intent intent=getIntent();
        String stockSymbol=intent.getStringExtra(MainActivity.STOCK_SYMBOL);

        companyNameView =(TextView)findViewById(R.id.companyNameView);
        yearLowView =(TextView)findViewById(R.id.yearLow);
        yearHighView    =(TextView)findViewById(R.id.yearHigh);
        daysLowView =(TextView)findViewById(R.id.daysLow);
        daysHighView    =(TextView)findViewById(R.id.daysHigh);
        LastPriceView   =(TextView)findViewById(R.id.lastPrice);
        changeView      =(TextView)findViewById(R.id.change);
        dailyPriceRangeView =(TextView)findViewById(R.id.dailyPriceRange);
        //Log.d(TAG, "Before URL creation" + stockSymbol);
        final String yqlURL=yahooURLFirst+stockSymbol+yahooURLSecond;
       //Log.d(TAG, "Before URL creation" + yqlURL);
        new MyAsyncTask().execute();
    }

    private class MyAsyncTask extends AsyncTask<String,String,String>{

        protected String doInBackground(String... args) {
                try{
                    String newstr=args[0];
                    Log.d("Sync",newstr);
                    URL url= new URL(args[0]);

                    //Log.d("Sync1","We are here");
                    URLConnection conn=url.openConnection();

                    HttpURLConnection httpconn=(HttpURLConnection)conn;

                    int responseCode=httpconn.getResponseCode();

                    if(responseCode==HttpURLConnection.HTTP_OK){
                        InputStream in=httpconn.getInputStream();
                        DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
                        DocumentBuilder db=dbf.newDocumentBuilder();
                        Document dom=db.parse(in);
                        org.w3c.dom.Element docEl= (org.w3c.dom.Element) dom.getDocumentElement();
                        NodeList nl = docEl.getElementsByTagName("qoute");
                        Log.d("Sync3","We are here");
                        if(nl!=null && nl.getLength() > 0){
                            for(int i=0;i<=nl.getLength();i++){
                                StockInfo theStock=getStockInfo(docEl);
                                name=theStock.getName();
                                yearLow=theStock.getYearLow();
                                yearHigh=theStock.getYearHigh();
                                daysLow=theStock.getDaysLow();
                                daysHigh=theStock.getDaysHigh();
                                lastTradePrice=theStock.getLastTradePriceonly();
                                change=theStock.getChange();
                                daysRange=theStock.getDaysRange();
                            }
                        }
                    }

            } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ParserConfigurationException e) {
                    e.printStackTrace();
                } catch (SAXException e) {
                    e.printStackTrace();
                }
finally {       }
            return null;
        }

        protected void onPostExecute(String result){
            companyNameView.setText(name);
            yearHighView.setText("Year High: " +yearHigh);
            yearLowView.setText("Year Low: "+yearLow);
            daysHighView.setText("Days High: "+daysHigh);
            daysLowView.setText("Days Low:"+ daysLow );
            LastPriceView.setText("Last Price"+ lastTradePrice);
            changeView.setText("Change: "+change);
            dailyPriceRangeView.setText("Daily Price Range: "+daysRange) ;
        }

private StockInfo getStockInfo(org.w3c.dom.Element entry){
    String stockName=getTextValue(entry,"Name");
    String stockYearLow=getTextValue(entry,"YearLow");
    String stockYearHigh=getTextValue(entry,"YearHigh");
    String stockDaysLow=getTextValue(entry,"DaysLow");
    String stockDaysHigh=getTextValue(entry,"DaysHigh");
    String stockLastTradePrice=getTextValue(entry,"LastTradePriceOnly");
    String stockChange=getTextValue(entry,"Change");
    String stockDaysRange=getTextValue(entry,"DaysRange");

    StockInfo theStock=new StockInfo(stockDaysLow
            ,stockDaysHigh  ,stockYearLow ,stockYearHigh ,stockName,stockLastTradePrice ,stockChange ,stockDaysRange);
return theStock;
}
private String getTextValue(org.w3c.dom.Element Entry, String tagName)
{
    String tagValueToReturn=null;
    NodeList nl=Entry.getElementsByTagName(tagName);
    if(nl!=null && nl.getLength() > 0){
        org.w3c.dom.Element ele=(org.w3c.dom.Element)nl.item(0);
        tagValueToReturn=ele.getFirstChild().getNodeValue();
        }
    return tagValueToReturn;
}
}
}

getting below error

FATAL EXCEPTION: AsyncTask #1
Process: com.shravan.stockinfo, PID: 2188
java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:304)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:818)
 Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=1
    at com.shravan.stockinfo.StockInfoActivity$MyAsyncTask.doInBackground(StockInfoActivity.java:89)
    at com.shravan.stockinfo.StockInfoActivity$MyAsyncTask.doInBackground(StockInfoActivity.java:85)
    at android.os.AsyncTask$2.call(AsyncTask.java:292)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:818) 

4 Answers 4

5

You are running the AsyncTask like new MyAsyncTask().execute(); which means you are not passing any argument to it.

But in doInBackground method you are trying to get a value at String newstr=args[0];but args array has length 0.

You need to start the AsycTask something like this

new MyAsyncTask().execute(yqlURL);
Sign up to request clarification or add additional context in comments.

3 Comments

done that working fine. but now I am not getting any values in my variables. they are showing blank.
@ShravanYadav: Can you show how your are passing it?
the above code has all the function for extracting the data from xml. There is another java file StockInfo which has variables and getter and setters only.
1

You are not sending the parameters to your async task so when you do args[0] it finds nothing, remember to send the parameters like this mytask.execute(params);

1 Comment

done that working fine now. but I am not getting any values in my variables. they are showing blank.
0
new MyAsyncTask().execute();  

you are passing nothing here, no arguments here.

 protected String doInBackground(String... args) {
                try{
                    String newstr=args[0];
                    Log.d("Sync",newstr);
                    URL url= new URL(args[0]);
....
}

Still trying to read here String newstr=args[0];, Just pass new MyAsyncTask(yourString).execute();

Comments

0

You need to send parameter when starting AsyncTask like

new MyAsyncTask().execute(yqlURL);

else it would throw ArrayIndexOutOfBoundsException as args size is zero.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.