2013-05-01 26 views
0

我試圖從我的應用程序中的網絡拉一些信息。網絡交互不能在MainActivity中完成,所以我有一個Runnable的實例來處理這個問題。然而,自從我開始,我得到一個空指針異常。 logcat的是在這些代碼塊指着我:Android的EntryAdapter超級崩潰()

public CelebrityEntryAdapter(Activity context, List<CelebrityEntry> list) { 
    super(context, R.layout.activity_celebrity, list); 
    this.context = context; 
    this.list = list; 
} 

和這裏(在 「適配器=新CelebrityEntryAdapter ......」 行):

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    context = this; 
    filterText = (EditText) getView().findViewById(R.id.search_box); 
    filterText.addTextChangedListener(filterTextWatcher); 
    new Thread(new Runnable(){ 
     public void run() 
     { 
      try { 
       adapter = new CelebrityEntryAdapter(context.getActivity(), populate()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      setListAdapter(adapter); 

      filterTextWatcher = new TextWatcher() { 

       public void afterTextChanged(Editable s) { 
       } 

       public void beforeTextChanged(CharSequence s, int start, int count, 
         int after) { 
       } 

       public void onTextChanged(CharSequence s, int start, int before, 
         int count) { 
        adapter.getFilter().filter(s); 
       } 
      }; 
     } 
    }).start(); 
} 

你覺得呢?

編輯:

這裏的logcat的:

05-01 18:49:36.391:E/AndroidRuntime(1468):致命異常:線程109
05-01 18:49:36.391: E/AndroidRuntime(1468):java.lang.NullPointerException
05-01 18:49:36.391:E/AndroidRuntime(1468):at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
05-01 18:49:36.391:E/AndroidRuntime(1468):at android.widget.ArrayAdapter。(ArrayAdapter.java:153)
05-01 18:49:36.391: E/AndroidRuntime(1468):at edu.Drake.doppelganger.CelebrityEntryAdapter。(CelebrityEntryAdapter.java:31)
05-01 18:49:36.391:E/AndroidRuntime(1468):at edu.Drake.doppelganger.CelebritiesFragment $ 1 .RUN(CelebritiesFragment.java:60)
05-01 18:49:36.391:E/AndroidRuntime(1468):在java.lang.Thread.run(Thread.java:856)

這裏的填充() :

public List<CelebrityEntry> populate() throws IOException { 
    List<CelebrityEntry> list = new ArrayList<CelebrityEntry>(); 
    HttpGet httppost = new HttpGet("http://www.ethanclevenger.com/MirrorMe/celebrity-master.txt"); 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity ht = response.getEntity(); 
    BufferedHttpEntity buf = new BufferedHttpEntity(ht); 
    InputStream is = buf.getContent(); 
    BufferedReader r = new BufferedReader(new InputStreamReader(is)); 
    String name; 
    String url; 
    while ((name = r.readLine()) != null) { 
     url = r.readLine(); 
     Log.v(url, url); 
     list.add(new CelebrityEntry(name, url)); 
    } 
    return list; 
} 

對不起,logcat格式很糟糕 - 試圖弄清楚。我已經能夠從「populate()」中記錄「url」和「name」 - 它肯定會檢索它。

良好的措施,這裏的構造函數:

public CelebrityEntry(String name, String pic) { 
    this.name = name; 
    this.pic = pic; 
} 
+0

你的logcat在哪裏? – 2013-05-01 18:58:51

+0

populate()的定義在哪裏?也許它返回空值 – eltabo 2013-05-01 19:07:26

回答

0

無論你想context.getActivity()是似乎回到null,因爲這是一個NullPointerException中的ArrayAdapterinit()方法的唯一來源。

除此之外:

  • 請不要試圖從後臺線程修改UI,因爲你是在這裏做什麼(專業提示:使用AsyncTask

  • 請不要只是一味地忽視一個例外,如你正在做的IOException

+0

感謝您的提示。我正在執行一個AsyncTask。我仍然得到這個空指針錯誤 - ArrayAdapter需要一個上下文和列表。上下文是包含有問題的代碼的ListFragment。如何獲取該上下文以傳遞到我的適配器? – 2013-05-01 20:08:22

+0

@EthanC:「上下文是有問題的代碼包含在ListFragment中」 - 否,因爲'ListFragment'不從'Context'繼承。從您提供的代碼中,不清楚爲什麼getActivity()會返回null。無論您是在創建片段,它可能會被綁定到。 – CommonsWare 2013-05-01 20:34:02

+0

查看我的代碼後,我發現參數名稱很差 - 它實際上需要一個片段和列表。所以重新提出了問題 - 我如何從我的異步任務中獲取片段? – 2013-05-01 20:59:37