我将 AsyncTask 用作具有以下签名的内部类:
public abstract class BaseFragmentActivity extends FragmentActivity {
static final int PROGRESS_DIALOG = 0;
Dialog progessDialog;<p></p>
<pre><code>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);
}
}
</code></pre>
<p>}</p>
<p>public abstract class BaseListFragmentActivity extends BaseFragmentActivity implements OnItemClickListener, OnClickListener{</p>
<pre><code>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);
</code></pre>
<p>}</p>
<p>public class ListAccountsActivity extends BaseListFragmentActivity {</p>
<pre><code>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;
}
</code></pre>
<p>}</p>
<p></p>
我在外部类中的回调方法 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();
正确的做法是什么?我是泛型的新手,所以我对这一切有点困惑。在此先感谢您的帮助。
最佳答案
在 doInBackground 中使用 String 而不是 Void
@Override
protected T doInBackground(String... params) {
return connector.getData(URLUtils.getFormattedUrl(curUrl),clazz);
}
关于android - AsyncTask 和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10424874/