【问题标题】:Want to create a Generic AsyncTask想要创建一个通用 AsyncTask
【发布时间】:2014-05-15 14:02:09
【问题描述】:

在我的项目中。对于几乎每个活动,我都必须制作一个 AsyncTask .. 而且几乎所有活动的工作都是相同的。我想创建一个通用的 AsyncTask 并扩展它。而且我还想在构造函数like this 中发送方法。然后每当我一个类扩展它。只需创建一个方法,它就能轻松完成我们的工作。和更少的编码..这很耗时..感谢提前帮助..

我的 asyncTask 之一是

private class GetData extends AsyncTask<String, Void, JSONObject> {

    @Override
    protected void onPreExecute() {
    super.onPreExecute();

    progressDialog = ProgressDialog.show(Calendar.this,
            "", "");

}

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

    String response;

    try {

        HttpClient httpclient = new DefaultHttpClient();

        HttpPost httppost = new HttpPost(url);

        HttpResponse responce = httpclient.execute(httppost);

        HttpEntity httpEntity = responce.getEntity();

        response = EntityUtils.toString(httpEntity);

        Log.d("response is", response);

        return new JSONObject(response);

    } catch (Exception ex) {

        ex.printStackTrace();

    }

    return null;
}

@Override
protected void onPostExecute(JSONObject result) 
{
    super.onPostExecute(result);

    progressDialog.dismiss();

    if(result != null)
    {
        try
        {
            JSONObject jobj = result.getJSONObject("result");

            String status = jobj.getString("status");

            if(status.equals("true"))
            {
                JSONArray array = jobj.getJSONArray("data");

                for(int x = 0; x < array.length(); x++)
                {
                    HashMap<String, String> map = new HashMap<String, String>();

                    map.put("name", array.getJSONObject(x).getString("name"));

                    map.put("date", array.getJSONObject(x).getString("date"));

                    map.put("description", array.getJSONObject(x).getString("description"));

                    list.add(map);
                }

                CalendarAdapter adapter = new CalendarAdapter(Calendar.this, list);

                list_of_calendar.setAdapter(adapter);
            }
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
    else
    {
        Toast.makeText(Calendar.this, "Network Problem", Toast.LENGTH_LONG).show();
    }
}

}

我只想为每个 AsyncTask 更改 post 执行中的代码。如果我创建一个泛型类并将 Particular Method 传递给它。这将非常有帮助..

【问题讨论】:

标签: inheritance android-asynctask overloading


【解决方案1】:

让你所有的活动implements一个接口说Ixxx,它有一个方法activityOnPostExecute(String json),并在asyncTask构造函数中将调用者活动作为Ixxx类型传递给@987654325 @,并在 GenerucTaskpostExecute() 调用 caller.activityOnPostExecute(result); 现在在每个活动中覆盖方法 activityOnPostExecute()

编辑: 这是我的意思

1- 使用onPoseExec() 方法创建所有活动都应实现的interface

public interface IAsyncHandler {
    public void onPostExec(String json);
}

2- 创建 GenericAsyncTask 类,

public class GenericAsyncTask extends AsyncTask<String, Integer, String> {
    IAsyncHandler handler = null;
    public GenericAsyncTask(IAsyncHandler h){
        handler = h;
    }
    @Override
    protected void onPreExecute() {

    }   
    @Override
    protected String doInBackground(String... params) {
        //whatever work goes here ...
        //return str as a result
        return str;
    }
    @Override
    protected void onPostExecute(String result) {
    //call the caller's class onPostExec(), it should be ovedrridden in the activity
        handler.onPostExec(result);
    }
}//CLASS

3- 在您的活动中,覆盖 onPostExec() 方法

@Override
public void onPostExec(String json) {
    // TODO Auto-generated method stub
}

4- 在您的活动onClick(),或某处执行GenericAsyncTask

onClick(View v){
    GenericAsyncTask task = new GenericAsyncTask(this);
    task.execute("some", "params","...");
}

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多