2016-08-14 7 views
1

Ich habe überprüft, dass die TextView, auf die ich referenziere, korrekt ist und bin sicher, dass die App über Internet-Berechtigungen verfügt.App stürzt ab, wenn AsyncTask verwendet wird

Ich versuche eine App zu schreiben, die den aktuellen Preis von Bitcoin aus der Coinbase API ziehen und in der TextView anzeigen wird. Der Code für die Interaktion mit der API wurde genau von einem Desktop-Java-Programm kopiert, das ich geschrieben habe, um den Preis zu erhalten und ihn in eine Datenbank zu schreiben. whod läuft seit fast einer Woche ohne Probleme.

Die App stürzt jedoch beim Start ab. Hier ist die einzige Java-Code:

import android.app.*; 
import android.os.*; 
import android.widget.*; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.*; 

public class MainActivity extends Activity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);  
     String price = ""; 
     TextView tester = (TextView) findViewById(R.id.ticker); 
     tester.setText("new text");//This is not displayed before crash 
     TickerTask ticker = new TickerTask(); 
     ticker.execute(); 

    } 


     private class TickerTask extends AsyncTask<Void, Void, Void> { 
      protected Void doInBackground(Void... nothing) { 
       String coinbase = "https://api.coinbase.com/v2/prices/spot?currency=USD"; 
       int i = 0; 
       int y = 0; 
       String price = ""; 
       String formatted_price; 
       TextView ticker = (TextView) findViewById(R.id.ticker); 
        try { 
         URL url = new URL(coinbase); 
         HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

         BufferedReader in = new BufferedReader (
         new  InputStreamReader(connection.getInputStream())); 
         String urlString = ""; 
         String current; 

         while ((current = in.readLine()) != null) { 
          urlString += current;      
         } 
         int begin = urlString.indexOf("amount"); 
         int end = urlString.indexOf("currency"); 
         price = urlString.substring(begin+9, end-3); 

         ticker.setText(price); 

        } catch (Exception e) { 
         ticker.setText(e.getMessage()); 
         }  
        y++; 
        return nothing[0]; 
        }//End of doInBackground 
     }//End of TickerTask 

} 
+3

zeigen Sie Ihre Stacktrace – GreyBeardedGeek

+0

Index außerhalb der Grenzen ... 'Rückkehr nichts [0];' –

+1

immer den Stacktrace anmelden, wenn eine Ausnahme geschieht, sonst werden Sie nie wissen, und wir können nicht helfen. – m0skit0

Antwort

1

Problem ist, dass Sie nicht UI in doInBackground ändern kann (Methode) und Sie genannt ticker.setText() das ist, warum es Fehler gibt. Verwenden Sie die Methode onPreExecute(), um die Variable zu initialisieren und die Methode onPostExecute(), um die Aufgabe auszuführen, nachdem die Hintergrundaufgabe abgeschlossen wurde.

Ich habe Ihren Code hier aktualisiert und es wird gut funktionieren. Schauen here to get idea about lifecycle of asyctask

class TickerTask extends AsyncTask<Void, Void, String> { 
    String coinbase; 
    int i, y; 
    String price, formatted_price; 
    TextView ticker; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     coinbase = "https://api.coinbase.com/v2/prices/spot?currency=USD"; 
     i = 0; 
     y = 0; 
     price = ""; 
     ticker = (TextView) findViewById(R.id.ticker); 
    } 

    protected String doInBackground(Void... nothing) { 
     try { 
      URL url = new URL(coinbase); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

      BufferedReader in = new BufferedReader(
        new InputStreamReader(connection.getInputStream())); 
      String urlString = ""; 
      String current; 

      while ((current = in.readLine()) != null) { 
       urlString += current; 
      } 

      return urlString; 


     } catch (Exception e) { 
      return "error" 
      e.printStackTrace(); 
     } 
//  return nothing[0]; 
      return "error"; 
    }//End of doInBackground 

    @Override 
    protected void onPostExecute(String urlString) { 
     super.onPostExecute(urlString); 
     if(!urlString.equal("error")) { 
      int begin = urlString.indexOf("amount"); 
      int end = urlString.indexOf("currency"); 
      price = urlString.substring(begin + 9, end - 3); 
      ticker.setText(price); 
     } else 
      ticker.setText("Error"); 
     y++; 
    } 
}//End of TickerTask 
2

doInBackground nicht die UI berühren kann. Wenn Sie diese Anrufe tätigen müssen (setText() in Ihrem Fall), tun Sie in 'onPreExecute()' oder onPostExecute().

+0

müssen Sie auch null anstelle von nichts [0] zurückgeben, da nichts leer sein wird – GreyBeardedGeek

+0

ah ... right..sind er 'execute()' aufgerufen – Shaishav

0

Versuchen private class TickerTask extends AsyncTask<String, String, String> statt private class TickerTask extends AsyncTask<Void, Void, Void>

Verwandte Themen