2013-03-29 76 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