Не могу прочитать строку () без сбоя моего приложения для Android - PullRequest
0 голосов
/ 15 ноября 2011

Я создаю приложение, которое принимает данные веб-сайта и просто отображает их.У меня это работало, но потом я попытался внедрить его в пользовательский интерфейс с вкладками, и теперь оно не работает.

Я сузил его до

    input = reader.readLine();

, это причина, но яне понимаю, в чем дело.

Главный класс

package app.stockup;

import java.util.ArrayList;

import app.stockup.R;

import android.app.Activity;
import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TabHost;

public class Main extends TabActivity
{
public static ArrayList<ShareSet> sharePortfolio = new ArrayList<ShareSet>();

Resources resources;
TabHost tabHost;

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    resources = getResources();
    tabHost = getTabHost();


    buildPortfolio();
    buildPage(Status.class, "Status", R.drawable.status_tab);
    buildPage(Portfolio.class, "Portfolio", R.drawable.portfolio_tab);

    tabHost.setCurrentTab(0);
}

private void buildPage(Class<? extends Activity> className, String tabName, int tabID)
{
    Intent intent = new Intent(this, className);

    tabHost.addTab(tabHost.newTabSpec(tabName)
           .setIndicator(tabName, resources.getDrawable(tabID))
           .setContent(intent));
}

private void buildPortfolio()
{       
    sharePortfolio.add(new ShareSet("BLVN", "Bowleven", 3960, R.id.portfolioTextBLVN, R.id.statusTextBLVN));
    sharePortfolio.add(new ShareSet("BP", "British Petroleum", 192, R.id.portfolioTextBP, R.id.statusTextBP));
    sharePortfolio.add(new ShareSet("EXPN", "Experian", 258, R.id.portfolioTextEXPN, R.id.statusTextEXPN));
    sharePortfolio.add(new ShareSet("HSBA", "HSBC", 343, R.id.portfolioTextHSBC, R.id.statusTextHSBC));
    sharePortfolio.add(new ShareSet("MKS", "Marks & Spencers", 485, R.id.portfolioTextMS, R.id.statusTextMS));
    sharePortfolio.add(new ShareSet("SN", "Smith & Nephew", 1219,     R.id.portfolioTextSN, R.id.statusTextSN));
}
}

Класс статуса

package app.stockup;

import java.util.ArrayList;
import java.util.Iterator;

import app.stockup.Main;
import app.stockup.ShareSet;
import app.stockup.WebReader;
import app.stockup.R;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TextView;

public class Status extends Activity
{   
private ArrayList<ShareSet> myShares = Main.sharePortfolio;
Iterator<ShareSet> iterator = myShares.iterator();

ShareSet mySet;

TextView connectionStatus, fieldID;

int color;
WebReader reader;

double currentPrice;
double openPrice;
double difference;

String input;
String percentage;
String shareDirection;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.status);
    connectionStatus = (TextView)findViewById(R.id.connectionStatus); 
    connectionStatus.setText("Internet : Connected");
    compareSharePrice();
}

public void compareSharePrice()
{       
    while(iterator.hasNext())
    {
        mySet = iterator.next();
        fieldID = (TextView)findViewById(mySet.getStatusFieldID());
        reader = new WebReader(mySet.getStockURL());
        input = reader.readLine();
        currentPrice = reader.getCurrentPrice(input);
        openPrice = reader.getOpenPrice(input);
        difference = Math.abs(openPrice - currentPrice);
        percentage = String.format("%.2f", 100/(openPrice/difference));

        if(currentPrice >= openPrice)
        {
            color = (int) Color.GREEN;
            shareDirection = "rocketed";
        }

        else if(currentPrice <= openPrice)
        {
            color = (int) Color.RED;
            shareDirection = "plummeted";
        }

        fieldID.setText(mySet.getStockCode() + " has " + shareDirection + " by " + percentage + "%");
        fieldID.setTextColor(color);
    }
}
}

WebReader Class

package app.stockup;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;

import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;

public class WebReader
{
private static Scanner scanner;

int trade;
int from;
int to;

String price;

public WebReader(URL url)
{
    try
    {
        URLConnection website = url.openConnection();
        InputStream inputStream = website.getInputStream();
        scanner = new Scanner(new BufferedInputStream(inputStream));
    }
    catch (IOException ioe) 
    {

    }
}

public String readLine()
{
    if (scanner.hasNextLine())
    {           
        return scanner.useDelimiter("\\A").next();
    }

    return null;
}

public double getCurrentPrice(String input)
{
    trade = input.indexOf("Last Trade:", 0);
    from = input.indexOf("<b><span", trade); 
    from = input.indexOf(">", from + 4);        
    to = input.indexOf("</span></b>", from);        
    price = input.substring(from + 1, to); 
    return Double.parseDouble(price); 
} 
/*
 * 
 */
public double getOpenPrice(String input)
{
    trade = input.indexOf("Open:", 0);
    from = input.indexOf("><td class", trade);
    from = input.indexOf(">", from + 4);        
    to = input.indexOf("</td></tr>", from);     
    price = input.substring(from + 1, to);
    return Double.parseDouble(price);
}
}

Ответы [ 3 ]

0 голосов
/ 15 ноября 2011

Вы микшируете Scanner.hasNextLine() и Scanner.next():

if (scanner.hasNextLine())
{           
    return scanner.useDelimiter("\\A").next();
}

Это вызовет исключение java.util.NoSuchElementException в последней строке ввода.Они обрабатывают строки по-разному для токенизации.

Использование:

return scanner.useDelimiter("\\A").nextLine();
0 голосов
/ 15 ноября 2011
catch (IOException ioe) 
    {

    }

Какова бы ни была проблема, она маскируется из-за вашей неспособности выполнить печать, запись в журнал или что-либо еще полезное с этим исключением. Никогда игнорировать исключение, и пока я ругаю, всегда печатает или регистрирует само исключение, а не только ваше собственное выдуманное сообщение об ошибке.

0 голосов
/ 15 ноября 2011

Я могу только предположить, что scanner никогда не создается в конструкторе WedReader. Сделайте что-нибудь полезное в блоке catch в этом конструкторе, даже если вы просто записываете через ADB, чтобы знать, что это не удалось.

...