3

我使用 AsyncTask 作为内部类,具有以下签名:


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;
}

}

我在外部类中的回调方法 displayData 有以下方法签名

public abstract <T> void displayData(T output);

现在我想扩展我的外部类并根据我期望的响应对象的类型为扩展类实现不同的 displaydata 方法。

当我在子类中定义如下方法时,我收到错误,因为它不是有效的覆盖:

@Override
public void displayData(ServerOutput output){}

Asynctask 被调用为:

new PerformOPTask<AccountData>(getString(R.string.get_account),AccountData.class).execute();

这样做的正确方法是什么。我是泛型的新手,所以我对这一切有点困惑。提前感谢您的帮助。

4

2 回答 2

2

在 doInBackground 中使用 String 而不是 Void

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

            return connector.getData(URLUtils.getFormattedUrl(curUrl),clazz);
        }
于 2012-05-03T04:27:02.970 回答
1

对您的代码进行此更改。

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> {
于 2012-05-03T04:24:55.953 回答