2016-08-14 280 views
1

我檢查過我引用的TextView是否正確,並確定該應用程序具有Internet權限。使用AsyncTask時應用程序崩潰

我正在嘗試編寫一個應用程序,它將從Coinbase的API中提取當前比特幣的價格並將其顯示在TextView中。與API交互的代碼完全從我編寫的桌面java程序中複製,以獲取價格並將其放入數據庫;現在已經連續運行了近一個星期。

該應用程序雖然在啓動時崩潰。這是唯一的Java代碼:

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

顯示您的堆棧跟蹤 – GreyBeardedGeek

+0

索引越界...'返回任何結果[0];' –

+1

,始終記錄堆棧跟蹤當異常情況發生,否則你永遠不知道,我們也沒有辦法。 – m0skit0

回答

1

問題是你不能在doInBackground(方法)更改UI,你叫ticker.setText()這就是爲什麼它是給錯誤。 使用onPreExecute()方法初始化變量,onPostExecute()方法完成後臺任務後執行任務。

我在這裏更新了你的代碼,它會很好的工作。看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不能碰UI。如果您需要這樣做,請撥打電話(setText()),在'onPreExecute()'或onPostExecute()

+0

你還需要返回null而不是任何東西[0],因爲什麼都不會是空的 – GreyBeardedGeek

+0

啊......因爲他調用execute()方法, – Shaishav

0

嘗試的private class TickerTask extends AsyncTask<String, String, String>代替private class TickerTask extends AsyncTask<Void, Void, Void>

相關問題