AsyncTask和泛型

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

    }
}

公共抽象类BaseListFragmentActivity继承自BaseFragmentActivity,实现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);

公共类ListAccountsActivity扩展自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();

这该怎么正确地做呢?由于我对泛型的东西比较陌生,所以有些困惑。非常感谢您提前给予的任何帮助。

2个回答

2

在doInBackground中使用String而不是Void

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

            return connector.getData(URLUtils.getFormattedUrl(curUrl),clazz);
        }

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> {

我无法将FragmentActivity设置为通用类,因为那不是我控制的东西,而是我使用的一个库。 - sab
抱歉,我更改了它。将BaseFragmentActivity变成通用的。 - Changwei Yao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接