将多个值传递给AsyncTask类

时间:2014-11-16 14:57:33

标签: java android android-asynctask

尝试将String和对象传递给AsyncTask类时遇到了一些问题。因此,当我点击按钮时,它应该将一个String和一个EventReview对象传递到AsyncTask类中:

viewDtlEventBtn.setOnClickListener(new OnClickListener(){
        public void onClick(View v){
            new GetEventDetailAsyncTask(new GetEventDetailAsyncTask.OnRoutineFinished() {
                public void onFinish() {
                    //Get the values returned from AsyncTask and pass it to another activity
                }
            }).execute(String.valueOf(eventIDTV.getText()));
        }
    });

在我的AsyncTask类中,我将String作为参数:

public static class GetEventDetailAsyncTask extends AsyncTask<String, Integer, Double> {
    EventController eventCtrl = new EventController();
    Context context;

    public interface OnRoutineFinished { // interface
        void onFinish();
    }

    private OnRoutineFinished mCallbacks;

    public GetEventDetailAsyncTask(OnRoutineFinished callback) { 
        mCallbacks = callback;
    }

    public GetEventDetailAsyncTask() {
    } // empty constructor to maintain compatibility

    public GetEventDetailAsyncTask(Context context){
        this.context = context;
    }

    @Override
    protected Double doInBackground(String... params) {
        try {
            eventCommentModel = eventCtrl.getEventCommentByID(params[0]);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute(Double result) {
        if (mCallbacks != null)
            mCallbacks.onFinish(); // call interface on finish

    }

    protected void onProgressUpdate(Integer... progress) {
    }
}

所以我想知道是否有任何可能的方法将String和EventReview对象传递给execute(),然后当doInBackground()时,每个都执行每个方法。任何指南?

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可以传递字符串和您的自定义类&#39; asynctask中Object[]中的对象。

Object[] obj = new Object[2];
obj[0] = "my data";
obj[1] = myEventReviewObj;
new GetEventDetailAsyncTask().execute(obj);

的AsyncTask:

public static class GetEventDetailAsyncTask extends AsyncTask<Object, Integer, Double> {


    @Override
    protected Double doInBackground(Object... params) {
    String paramStr = "";
    EventReview eventReview = null;
        if(params[0] instanceof String && params[1] instanceof EventReview) {
            paramStr = (String) params[0];
            eventReview = (EventReview) params[1];
        }
        else {
            eventReview = params[0];
            paramStr = params[1];
        }

        try {
            //perform operation using String and Object as per your need
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
}

希望这有帮助。

答案 1 :(得分:0)

创建自定义构造函数并将传递的变量保存在AsyncTask中:

public static class GetEventDetailAsyncTask extends AsyncTask<String, Integer, Double> {
    EventReview eventReview;
    private OnRoutineFinished mCallbacks;
    String string;
    Context context;

    public GetEventDetailAsyncTask(OnRoutineFinished callback, String str, EventReview review) { 
        mCallbacks = callback;
        string = str;
        eventReview = review;
    }

    ...
}

然后通过传递你的vars来调用AsyncTask:

public void onClick(View v){
    new GetEventDetailAsyncTask(
            new GetEventDetailAsyncTask.OnRoutineFinished() {
                public void onFinish() {
                    // Get the values returned from AsyncTask and pass it to another activity
                }
            },
            String.valueOf(eventIDTV.getText(),
            eventReview).execute());
}

答案 2 :(得分:0)

您可以将类更改为接受Object作为输入:

public static class GetEventDetailAsyncTask extends AsyncTask<Object, Integer, Double>

并检查对象是String还是EventReview

的实例
 @Override
    protected Double doInBackground(Object... params) {
        if(params[0] instanceof String) // it is String
        else if(params[0] instanceof EventReview) // it is EventReview
    }