run - come usare inputstream come param in android asynctask?



asynctask<> (2)

Sto facendo un'applicazione Android per tenere traccia dei dettagli delle scorte e ho intenzione di recuperare i dati tramite csv (finanza yahoo). Come so, in Android 4.0, la connessione di rete non può essere effettuata sul thread principale. Pertanto, userò asynctask per effettuare la connessione. Tuttavia, devo affrontare alcuni problemi con i parametri. Vorrei chiedere che il tipo di input può usare come parametri?

public class StockDetails extends Activity {
    private InputStream is = null;
    private BufferedReader reader = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.stock_details);
        Intent i = getIntent();
        String stockNo = i.getStringExtra(MainActivity.STOCK_NO).toString();
        Log.i("Stock No", stockNo);
        String strURL = "http://download.finance.yahoo.com/d/quotes.csv?s="+ stockNo +".HK&f=nsl1opc1";
        Log.i("URL", strURL);
        class HostConnection extends AsyncTask<String, Void, InputStream> {
            private Exception ex;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            protected InputStream doInBackground(String... urls) {
                try {
                    // defaultHttpClient
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet(urls[0]);
                    HttpContext localContext = new BasicHttpContext();
                    HttpResponse httpResponse = httpClient.execute(httpGet, localContext);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    return httpEntity.getContent();
                } catch (Exception e) {
                    this.ex = e;
                    return null;
                } 
            }
            @Override
            protected void onPostExecute(InputStream is) {
                super.onPostExecute(is);
                reader = new BufferedReader(new InputStreamReader(is));
            }
        }
        new HostConnection().execute(strURL);
        try {
            String line;
            while ((line = reader.readLine()) != null){
                String[] RowData = line.split(",");
                String name = RowData[0];
                String symbol = RowData[1];
                String currPrice = RowData[2];
                String open = RowData[3];
                String prevClose = RowData[4];
                String change = RowData[5];

                TextView stockName = (TextView)findViewById(R.id.stockName);
                stockName.setText(name);
                TextView stockSymbol = (TextView)findViewById(R.id.stockSym);
                stockSymbol.setText(symbol);
                TextView stockCurrPrice = (TextView)findViewById(R.id.currPrice);
                stockCurrPrice.setText(currPrice);
                TextView stockOpen = (TextView)findViewById(R.id.open);
                stockOpen.setText(open);
                TextView stockPrevClose = (TextView)findViewById(R.id.prevClose);
                stockPrevClose.setText(prevClose);
                TextView stockChange = (TextView)findViewById(R.id.change);
                stockChange.setText(change);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        ...
    }

}

Quanto sopra è il mio codice e non può eseguire la dichiarazione return httpEntity.getContent(); e salta nella parte di eccezione. Per favore aiuto. Grazie!

https://src-bin.com


Answer #1

Se non si desidera attendere la lettura dell'intero flusso di input fino a quando onPostExecute viene chiamato, leggerlo in doInBackground .

Quando leggi un risultato importante, onProgressUpdate thread dell'interfaccia utente implementando onProgressUpdate ma dovresti probabilmente elaborare l' InputStream nel thread in background e non restituirlo come risultato, perché potresti incorrere in problemi di buffering.


Answer #2

Usare InputStream come tipo di valore Result è perfettamente legale, così come qualsiasi altra classe. Ma è necessario essere consapevoli che un AsyncTask viene eseguito in modo asincrono, quindi se si chiama new HostConnection().execute(strURL); e poi provate immediatamente ad usare le variabili che vengono inizializzate all'interno AsyncTask , sarete nei guai. Dovresti aspettare che l' AsyncTask finisca la sua esecuzione definendo un qualche tipo di meccanismo di callback, o nel tuo caso, dato che AsyncTask è una classe interna, puoi semplicemente spingere tutto il codice relativo a BufferedReader a onPostExecute() .





android-asynctask