当试图从服务器Android Studio读取文本文件时,应用程序崩溃

当试图从服务器Android Studio读取文本文件时,应用程序崩溃,android,sdk,crash,Android,Sdk,Crash,早些时候,当我开发我的应用程序时,从服务器读取文本文件不会引起任何问题。现在,每当我这样做时,应用程序就会崩溃,并显示“发生了意外错误”。我使用的是4.1.2版API 以下是我主要活动的代码: package awsomisoft.yemeb; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.

早些时候,当我开发我的应用程序时,从服务器读取文本文件不会引起任何问题。现在,每当我这样做时,应用程序就会崩溃,并显示“发生了意外错误”。我使用的是4.1.2版API

以下是我主要活动的代码:

package awsomisoft.yemeb;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;


public class Main extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new Thread() {
        TextView urlTextOut = (TextView) findViewById(R.id.URLtextView);
        StringBuilder text = new StringBuilder();
        @Override
        public void run() {
            try

            {
                String str = "";
                URL url = new URL("myurlhere");

                BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

                while ((str = in.readLine()) != null) {
                    text.append(str);
                }
                in.close();
            } catch (MalformedURLException e1)

            {
            } catch (IOException e)

            {
            }

            urlTextOut.setText(text);
        }
    }.start();
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}
我在网上看过,由于NetworkOnMainThreadException,大多数解决方案都涉及将读取的代码放入新线程。代码是否存在导致崩溃的错误?我还向清单文件(AndroidManifest.xml)添加了权限


有办法解决这个问题吗?如果需要更多信息,请询问,我可以提供。

我看到您更改了TextView而不是UI线程。请在onCreate()中找到您的视图

当您更改文本时:

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                urlTextOut.setText(text);
            }
        });
  • 将来,您应该能够在IDE的logcat窗口中查看日志、异常堆栈跟踪等。您正在从IDE启动应用程序,对吗

  • 我认为您的具体问题是由于您试图从UI线程以外的线程访问UI元素,这是不可能的。您需要将代码放入runOnUiThread()调用中才能使其工作


  • 我对Android Studio不太熟悉,是否有logcat的输出可以查看错误的堆栈跟踪?老实说,我对它也相当陌生。另外,有什么方法可以查看Nexus上的错误日志?当您从IDE运行应用程序时,Android Studio应该自动弹出一个logcat窗口。就像这样:我正在我的平板电脑上运行应用程序。是的,但是你是从Android Studio(使用Run菜单)启动它,还是手动将APK传输到设备并安装它?我是将runOnUiThread放在线程内还是线程外?在线程内而不是urlTextOut.setText(文本);我这样做了,结果出现了一个错误“变量‘urlTextOut’在内部类中被访问,需要声明为final。”我该如何解决这个问题?只需将这个变量设为final。如果您将这行代码改为:urlTextOut.setText(text);在try\catch块中,应该抛出类似CalledFromErrorThreadException的异常。谢谢,另一个用户建议了相同的解决方案,并且成功了。很高兴它成功了。:)只需确保将其中一个答案标记为已接受,以便人们看到您的问题已得到解决。
    runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    urlTextOut.setText(text);
                }
            });