2010-03-14 3 views
10

Tôi có một hoạt động hiển thị một số mục trong Danh sách. Khi tôi nhấp vào một mục danh sách, ứng dụng của tôi sẽ kiểm tra loại kết nối nào có sẵn ("WIF" hoặc "MOBILE"), thông qua NetworkInfo.getTypeName(). Ngay khi tôi gọi phương thức này, tôi nhận được một NullpointerException. Tại sao?Android, NetworkInfo.getTypeName(), NullpointerException

Tôi đã thử nghiệm tính năng này trên trình giả lập, khiến điện thoại của tôi hiện không khả dụng (bị hỏng ...). Tôi cho rằng đây là vấn đề? Đây là lời giải thích duy nhất mà tôi có, nếu đó không phải là trường hợp tôi không có ý tưởng tại sao điều này sẽ là null.

Dưới đây là một số đoạn mã:

public class VideoList extends ListActivity{ 
... 
public void onCreate(Bundle bundle){ 
    final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    ... 
    listview.setOnItemClickListener(new OnItemClickListener(){ 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    ... 
    NetworkInfo ni = cm.getActiveNetworkInfo(); 
    String connex = ni.getTypeName(); //Nullpointer exception here 
    if(connex.equals("WIFI")doSomething(); 
    } 
    }); 
} 
} 

Trả lời

10

Cuộc gọi getActiveNetworkInfo() có thể trả về null nếu không có mạng lưới hoạt động và bạn cần phải kiểm tra cho điều đó. Đây là mã nguồn từ here.

/** 
* Return NetworkInfo for the active (i.e., connected) network interface. 
* It is assumed that at most one network is active at a time. If more 
* than one is active, it is indeterminate which will be returned. 
* @return the info for the active network, or {@code null} if none is active 
*/ 
public NetworkInfo getActiveNetworkInfo() { 
    enforceAccessPermission(); 
    for (NetworkStateTracker t : mNetTrackers) { 
     NetworkInfo info = t.getNetworkInfo(); 
     if (info.isConnected()) { 
      return info; 
     } 
    } 
    return null; 
} 

Lưu ý đặc biệt javadoc: "trả về thông tin cho mạng hiện hoạt hoặc null nếu không có hoạt động".

2

Tôi hiểu rằng bạn có kết nối và trình giả lập có thể sử dụng nó nhưng sau đó lệnh gọi getActiveNetworkInfo() trả về giá trị rỗng cho bạn, và đó là lý do tại sao bạn bị phân vân.

Vâng, sự nghi ngờ của bạn là đúng: getActiveNetworkInfo() không hoạt động trên trình giả lập và luôn trả về giá trị rỗng.

2

Tôi thấy rằng nếu bạn nhấn F8 để bật 3G trên trình giả lập, cm.getActiveNetworkInfo() sau đó trả về một xử lý không sử dụng NetworkInfo.

-1

Thay vì

if(connex.equals("WIFI") doSomething(); 

thử

if("WIFI".equals(connex)) doSomething(); 
+1

Đừng bao giờ làm điều kiện Yoda xin vui lòng ... tôi khá thích if (Connex! = Null && connext.equals ("WIFI")) – Necronet