2013-03-29 75 views
3

剛開始編程,我編寫了我的第一個應用程序。我已經在這個問題上弄了很長時間了。我從教程中選擇了這一點,其中在ListFragment中實現了一個監聽器,並且事件監聽器位於承載ListFragment的FragmentActivity中。下面是它是如何在這個例子中(只顯示相關部分):在FragmentActivity中使用事件監聽器在android應用程序類中實現監聽器

MYLIST類:

public class MyList extends ListFragment{ 

    OnSomeItemSelectedListener mCallback; 

    public interface OnSomeItemSelectedListener { 
     public void onSomeItemSelectedListener(int position, long id); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception. 
     try { 
     mCallback = (OnSomeItemSelectedListener) activity; 
     } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
     + " must implement OnSomeItemSelectedListener"); 
     } 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     mCallback.onSomeItemSelectedListener(position, id); 
    } 
} 

MainActivity類別:

public class MainActivity extends FragmentActivity implements 
     MyList.OnSomeItemSelectedListener{ 

    @Override 
    public void onSomeItemSelectedListener(int position, long id) { 
     //some stuff done here when clicked on a item from the listfragment 
    } 
} 

上述作品完美無缺。

我試圖在應用程序類中實現此目的,以便在AsyncTask完成時通知事件偵聽器(FragmentActivity)。這是我在應用程序類確實在:

所有MyApplication類:

public class MyApplication extends Application { 

    OnFetchCompleteListener mCallback; 

    public interface OnFetchCompleteListener { 
     public void onFetchCompleteListener(); 
    } 

    public synchronized void fetchUpdates() { 
     String[] mURLs = getURLs(); 
     new DownloadDataAsyncTask().execute(mURLs[0], mURLs[1]); 
    } 

    private class DownloadDataAsyncTask extends 
      AsyncTask<String, Void, JSONObject[]> { 

     @Override 
     protected JSONObject[] doInBackground(String... params) { 
      //Some stuff 
      return mJSON; 
     } 

     @Override 
     protected void onPostExecute(JSONObject[] result) { 
      // Informing listeners on fetchData complete 
      mCallback.onFetchCompleteListener(); 
     } 
    } 
} 

如何實例化應用程序類的mCallback?沒有這個,

mCallback = (OnSomeItemSelectedListener) activity; 

我從應用程序類中得到一個空指針異常。

非常感謝

+1

爲什麼不能直接從AsyncTask通知活動,爲什麼你需要一個應用程序作爲中介? – Egor

+0

我的AsyncTask在應用程序類中。即使我這樣做,我仍然需要實例化mCallback。這就是我的問題所在。 – fahmy

+0

我認爲你使用的應用程序類不當。將AsyncTask實現保持爲獨立類並將OnFetchCompleteListener的實現作爲參數傳遞將會更合適。 – Egor

回答

2

我想你可以從活動而不是從應用實例mCallback。

在你活動的onCreate()或的onResume()方法,你可以寫:

MyApplication myApplication = getApplication(); 
myApplicaton.mCallback = this; 

但要確保您的活動已實現OnFetchCompleteListener(我不爲什麼,你在最後一段代碼類型OnSomeItemSelectedListener )

+0

我會嘗試並讓你知道。關於最後一段代碼,這就是它的例子。當mCallback被實例化時,該活動被轉換爲OnSomeItemSelectedListener。 – fahmy