2016-03-07 7 views
2

Я использую код ниже. Это дает ошибку в Android Studio. Вы можете помочь. Согласно моему пониманию, args [0] не заполняется некоторой ценностью. Почему это? если args [0] не выбирает какое-либо значение для любой другой реализации.java.lang.RuntimeException: Произошла ошибка во время выполнения doInBackground()

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

становится ниже ошибки

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)  

ответ

2

Вы находитесь работает AsyncTask, как new MyAsyncTask().execute();, что означает, что вы не передаете ему никаких аргументов.

Но в doInBackground методе вы пытаетесь получить значение в String newstr=args[0]; но args массив имеет длину 0.

Вы должны начать AsycTask что-то вроде этого

new MyAsyncTask().execute(yqlURL); 
+0

сделано это работа хорошо. но теперь я не получаю никаких значений в переменных. они показывают пустоту. –

+0

@ShravanYadav: Можете ли вы показать, как вы его передаете? – Rohit5k2

+0

приведенный выше код имеет всю функцию для извлечения данных из xml. Существует еще один java-файл StockInfo, который имеет только переменные и getter и seters. –

1

Вы не отправляя параметры вашей асинхронной задачи так, когда вы args[0] он ничего не находит, не забудьте отправить параметры как этот mytask.execute(params);

+0

сделано это хорошо работая сейчас. но я не получаю никаких значений в переменных. они показывают пустоту. –

0
new MyAsyncTask().execute(); 

вы передаете ничего здесь, никаких аргументов здесь.

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

Тем не менее пытается прочитать здесь String newstr=args[0];, Просто передайте new MyAsyncTask(yourString).execute();

0

Вам необходимо отправить параметр при запуске AsyncTask как

новый MyAsyncTask() выполнить (yqlURL).

иначе он будет вызывать ArrayIndexOutOfBoundsException, поскольку размер args равен нулю.

+0

Почему я был проголосован? – nitinkumarp

Смежные вопросы