从URL读取内容会导致Android应用程序崩溃

时间:2013-10-29 18:05:07

标签: java android

我在这款Android应用中遇到了问题。当我按下button_x时,它总是崩溃。该计划如下。我使用BufferedReader来读取Internet上的内容。

public class MainActivity extends Activity {

    Button button_x;

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

        button_x = (Button)findViewById(R.id.button_x);

        button_x.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                URL yahoo = null;
                try {
                    yahoo = new URL("http://www.google.com.tw/");
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                BufferedReader in = null;
                try {
                    in = new BufferedReader(
                                new InputStreamReader(
                                yahoo.openStream()));
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                String inputLine;

                try {
                    while ((inputLine = in.readLine()) != null)
                        button_x.setBackgroundColor(Color.RED);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                try {
                    in.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });


    }

    @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;
    }

}

我认为它是由Internet权限引起的,所以我在清单文件上添加了Internet权限。          

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
    <uses-permission android:name="android.permission.INTERNET" />"

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.euro.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

有人可以告诉我为什么这个程序会崩溃吗?

1 个答案:

答案 0 :(得分:1)

您无法在Android中的UI线程上进行网络连接。您需要创建新的Thread或使用AsyncTask。根据文档中的Connecting to the Network

  

网络运营可能涉及不可预测的延迟。为防止此操作导致糟糕的用户体验,请始终在UI的单独线程上执行网络操作。 AsyncTask类提供了从UI线程启动新任务的最简单方法之一。