I am using AsyncTask as an inner class with the following signature as below:
public abstract class BaseFragmentActivity extends FragmentActivity { static final int PROGRESS_DIALOG = 0; Dialog progessDialog;public abstract void displayData(T output); @Override protected Dialog onCreateDialog(int id) { if (id == PROGRESS_DIALOG) { ProgressDialog progressDialog = ProgressDialog.show(this, "", "Loading. Please wait...", true); progessDialog = progressDialog; } return progessDialog; } class PerformOPTask<T> extends AsyncTask<Void, String, T> { // connector=new JSONConnector(); Connector connector; String curUrl; Class<T> clazz; PerformOPTask(String url, Class<T> curClazz) { //connector = new UnitTestConnector(); connector = new JSONConnector(); curUrl = url; clazz = curClazz; } @Override protected T doInBackground(Void... params) { return connector.getData(URLUtils.getFormattedUrl(curUrl),clazz); } @Override protected void onPostExecute(T output) { displayData(output); } }}
public abstract class BaseListFragmentActivity extends BaseFragmentActivity implements OnItemClickListener, OnClickListener{
protected ListView mList; /** Called when the activity is first created. */ public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.table_list); CommonUtil.getActionBarWithBackButton(this,getLayoutInflater()); mList=(ListView)findViewById(R.id.table_list_listView); mList.setOnItemClickListener(this); } public void onBackABButtonPressed(View view) { finish(); } @Override public void onClick(View v) { // TODO Auto-generated method stub } @Override public abstract void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3);}
public class ListAccountsActivity extends BaseListFragmentActivity {
protected Acct[] mItems; private String[] mIcons; protected boolean displayHandledBySubClass=false; /** Called when the activity is first created. */ public void onCreate(Bundle icicle) { super.onCreate(icicle); // Create an array of Strings, that will be put to our ListActivity // Log.i("MY INFO",this.runJSONParser().getAcct().toString()); AccountData actData = new AccountData(); //actData=(AccountData) new PerformOPTask<AccountData>(getString(R.string.get_account),AccountData.class).execute(); showDialog(PROGRESS_DIALOG); //.getData(URLUtils.getFormattedUrl(getString(R.string.get_account)),actData); } @Override public void onItemClick(AdapterView<?> lv, View view, int position, long id) { // super.onListItemClick(l, v, position, id); // Get the item that was clicked Acct account = (Acct) mList.getAdapter().getItem(position); Intent intent=new Intent(this,AccountDetailViewActivity.class); intent.putExtra("selectedAccount",account); startActivity(intent); } @Override **public void displayData(ServerOutput output){** //error here if(displayHandledBySubClass){ //handle display in subclass handleDisplayData(output); } else { Acct[] accountArray = new Acct[((AccountData)output).getAccount().size()]; mItems = ((AccountData)output).getAccount().toArray(accountArray); IWMArrayAdapter<Acct> adapter = new IWMArrayAdapter<Acct>(this, mItems); adapter.setIcons(mIcons); adapter.setArrowNeeded(); //mList is superClassVariable mList.setAdapter(adapter); dismissDialog(PROGRESS_DIALOG); adapter.notifyDataSetChanged(); } } public void handleDisplayData(SrOutput output){ } @Override public boolean onCreateOptionsMenu(Menu menu) { //Toast.makeText(this, "Tapped search", Toast.LENGTH_SHORT).show(); super.onCreateOptionsMenu(menu); MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.list_servers_menu, menu); // Calling super after populating the menu is necessary here to ensure // that the // action bar helpers have a chance to handle this event. return true; }}
I have the following method signature for my calback method displayData in the outer class
public abstract <T> void displayData(T output);Now I want to extend my outer class and implement displaydata method differently for extended classes based on the type of response object I am expecting.
When I define a method as below in subclass I am getting error as not a valid override:
@Override public void displayData(ServerOutput output){}Asynctask is invoked as :
new PerformOPTask<AccountData>(getString(R.string.get_account),AccountData.class).execute();What is the correct way to do this. I am new to generics stuff so I am a little bit confused about all this. Thanks in advance for any help.
Make this change to your code.