3

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.

sab
  • 9,767
  • 13
  • 44
  • 51

2 Answers2

2

Use String instead of Void in doInBackground

 @Override
        protected T doInBackground(String... params) {

            return connector.getData(URLUtils.getFormattedUrl(curUrl),clazz);
        }
Bhaskar Reddy
  • 480
  • 5
  • 13
1

Make this change to your code.

public abstract class BaseFragmentActivity<T> extends FragmentActivity{
public abstract void displayData(T output);

class PerformOPTask extends AsyncTask<Void, String, T>




/* ListAccountsActivity*/
public class ListAccountsActivity extends BaseListFragmentActivity<ServerOut> {
Changwei Yao
  • 13,051
  • 3
  • 25
  • 22