2014-11-25 74 views
0

我有一个android Activity,它在URL http://developernetwork.net78.net/readUnivs.php上发出HTTP GET请求时崩溃。让URL连接崩溃我的应用程序

该应用程序只需简单地做一个HTTP GET请求到服务器,以纯文本形式由\n字符分隔将返回教育大学的名单。该列表然后在android.widget.ArrayAdapter的帮助下被设置为android.widget.Spinner中的列表数据。

这里91A的服务器上我的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); 
?> 

这里是我的android活动:

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代替读取服务器响应的循环,该应用运行良好。我认为循环有一些问题。有人可以指出问题可能是什么?

+0

检查这里:http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception – 2014-11-25 10:52:34

回答

1

由于蜂窝(3.0),你不能在UIThread网络请求。 考虑使用AsyncTask,使请求doInBackground

然后进行更改在UIThread在onPostExecute

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

+0

你能给我一个示例代码吗?因为我也必须更新微调。也就是说,在UI中进行更改。这是我猜不允许除了主线程在android中的线程。 – 2014-11-25 10:52:38

+0

检查我编辑的答案。现在去吃午饭,祝你好运! – Carnal 2014-11-25 10:55:47

1

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

+0

能否请您给我一个例子代码?因为我也必须更新微调。也就是说,在UI中进行更改。这是我猜不允许除了主线程在android中的线程。 – 2014-11-25 10:51:24

+0

http://programmerguru.com/android-tutorial/android-asynctask-example/请参阅此链接。 – MathanG 2014-11-25 10:55:50