android - AsyncTask 和泛型

标签 android generics android-asynctask

我将 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/

相关文章:

android - 从 Facebook 链接打开应用程序

android - 单击 ListView 上的删除按钮后删除 ListView 上的项目

java - 如何比较两个类

java - HashMap<类<?>, 列表<类<?>>> : specify that the lists' classes extend the keys'

typescript - 如何在泛型函数类型中拥有可选参数类型?

java - 如何将对象传递给我的 AsyncTask?

android - 停止服务后如何从传感器注销监听器?

java - 任务 :app:compileDebugJavaWithJavac in Android Studio java 执行失败

java - 在 ASync 类中覆盖和重写

android - 在 IntentService 和 AsyncTask (Android) 之间使用共享代码时出现 Realm `access from incorrect thread` 错误