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 で Void の代わりに String を使用する

 @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 に答える