在线程崩溃的应用程序中运行的JsonReader

时间:2015-06-14 11:47:03

标签: java android json multithreading jsonreader

我的应用程序崩溃不可预测,我不明白为什么。我正在使用this one来检索json文件,我正在尝试使用HttpURLConnection类来读取,并使用该文件。问题是应用程序在读取或对JsonReader实例执行任何操作后崩溃。

我用扫描仪读取了输入流但导致了类似的问题。但是,当使用扫描仪阅读时,我可以从服务器打印少量的json。所以来自服务器的数据也可能会进入JsonReader。

这是我的代码:

<content><![CDATA[!DOCTYPE html>

这将在主UI线程中创建的线程上运行。

public class ConnectToServer implements Runnable {

private URL connectionUrl;
private MainActivity output;

public ConnectToServer(URL url, MainActivity mainActivity) {
    connectionUrl = url;
    output = mainActivity;
}

public void printError(String errorMessage){
    output.output(errorMessage);
}

public InputStream GetInputStream(){
    try {
        HttpURLConnection connection = (HttpURLConnection)connectionUrl.openConnection();
        InputStream inputStream = new BufferedInputStream(connection.getInputStream());
        if (inputStream == null){
            printError("Input stream is null");
        }
        return inputStream;
    } catch (IOException ex){
        printError("IO exception has been thrown");
    } catch (Exception ex){
        printError("Normal exception thrown: " + ex.getClass().getSimpleName());
    }
    return null;
}

@Override
public void run() {
    InputStream inputStream = GetInputStream();
    try {
        if (inputStream == null){
            printError("Input stream not initiated");
        } else {
            JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));
            printError(reader.toString());
            reader.close();
        }
    } catch (Exception ex){
        printError("Exception while printing input stream: " + ex.getClass().getSimpleName());
    }
    printError("Thread finished");
}

有人知道为什么这段代码会导致我的应用崩溃吗?即使它达到“线程完成”,它也会很快崩溃。

顺便说一下,我意识到我应该使用AsyncTask,但我已经走下了这条赛道而且我宁愿先把它拿走。

logcat的:

public void connect(){
    output("connect started");
    boolean success = true;
    try {
        URL url = new URL("http://geonews.azurewebsites.net/api/Location");
        serverConnection = new ConnectToServer(url,this);
        Thread thread = new Thread(serverConnection);
        thread.start();
    } catch (MalformedURLException ex){
        output("Messed up the URL");
        success = false;
    }
    if (success){
        output("Thread has been started");
    } else {
        output("exception was thrown while trying to run thread");
    }
}

1 个答案:

答案 0 :(得分:0)

我相信来自output的{​​{1}}方法会修改TextView,从而触发异常。

视图层次结构只能从“主”线程更改,在这种情况下,您可能想尝试查看MainActivity,StackOverflow上的一些资源:

希望这会有所帮助,祝你好运:)

修改:

您可能还想使用Android runOnUiThread而不是使用Log来显示错误。