建立 URL 连接会使我的应用程序崩溃


Making URL connections crashes my app

我有一个安卓Activity,它在URL上发出HTTP GET请求时崩溃http://developernetwork.net78.net/readUnivs.php。

该应用程序只需向服务器发出HTTP GET请求,服务器将以纯文本形式返回教育大学列表,以'n字符分隔。然后,在android.widget.ArrayAdapter的帮助下,此列表在android.widget.Spinner中设置为列表数据。

这是我在服务器上的PHP代码

<?php
    $conn = mysqli_connect($url, $username, $passwd, $database_name);
    $result = mysqli_query($conn, "SELECT University FROM Universities");
    while($row = mysqli_fetch_array())
        print($row["University"]."'n");
    print("END");
    mysqli_close($conn);
?>  

这是我的安卓活动:

package com.adi.test;
import android.os.Bundle;
import android.app.Activity;
import android.widget.Spinner;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import java.util.ArrayList;
import java.util.Scanner;
import java.net.URL;
import java.net.HttpURLConnection;

public class TestActivity extends Activity {
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
         try { 
                URL url = new URL("http://developernetwork.net78.net/readUnivs.php");
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setRequestProperty("User-Agent", "Mozilla/5.0");
                Scanner sc = new Scanner(conn.getInputStream());
                ArrayList<String> list = new ArrayList<String>();
                while(sc.hasNextLine()) {
                    String line = sc.nextLine();
                    if(!line.equals("END"))
                        list.add(line);
                }
                sc.close();
            } catch(IOException exception) {
            }
            Spinner spinner = new Spinner(this);
            spinner.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner.setAdapter(adapter);
            layout.addView(spinner);
            setContentView(layout);
    }   
 }

该应用程序在我的LG L90上编译和安装良好。但它一打开就会崩溃。为什么会这样?如果我添加一个简单的循环,将一个数字从 0 增加到 10 来代替读取服务器响应的循环,则应用程序运行良好。我认为循环存在一些问题。有人可以指出问题可能是什么吗?

从 Honeycomb (3.0) 开始,您无法在 UIThread 中发出网络请求。请考虑使用AsyncTask并在 doInBackground 中发出请求。

然后在 UIThread in onPostExecute 中进行更改。

下面是一个示例:http://programmerguru.com/android-tutorial/android-asynctask-example/

您正在从主线程访问 URL。所以android.os.NetworkOnMainThreadException将会发生。它会使您的应用程序崩溃。在 AsynTask 上执行网络操作。

相关文章: