Android 从AsyncTask向片段(非活动)发送数据

Android 从AsyncTask向片段(非活动)发送数据,android,android-asynctask,callback,Android,Android Asynctask,Callback,我已经将jsonresponse数组数据带到了onPostExecute,现在我想将jsonresponse传递给主片段。但当我尝试时,它给出了一个错误,如图所示。我已经明白了这个答案,任何帮助都将是巨大的 异步任务类 public class PizzaMenuAsyncTask extends AsyncTask<String, Integer, JSONArray> { private OnTaskCompleted listener; private JSON

我已经将jsonresponse数组数据带到了onPostExecute,现在我想将jsonresponse传递给主片段。但当我尝试时,它给出了一个错误,如图所示。我已经明白了这个答案,任何帮助都将是巨大的

异步任务类

public class PizzaMenuAsyncTask extends AsyncTask<String, Integer, JSONArray> {
    private OnTaskCompleted listener;
    private JSONArray responseJson = null;
    private Context contxt;
    private Activity activity;
    String email;

    public PizzaMenuAsyncTask(Context context) {

        // API = apiURL;
        this.contxt = context;
    }

    public PizzaMenuAsyncTask(OnTaskCompleted listener) {
        this.listener = listener;
    }

    // async task to accept string array from context array
    @Override
    protected JSONArray doInBackground(String... params) {

        String path = null;
        String response = null;
        HashMap<String, String> request = null;
        JSONObject requestJson = null;
        DefaultHttpClient httpClient = null;
        HttpPost httpPost = null;
        StringEntity requestString = null;
        ResponseHandler<String> responseHandler = null;

        // get the email and password

        try {
            path = "xxxxxxxxx/ItemService.svc/ProductDetails";

            new URL(path);
        } catch (MalformedURLException e) {

            e.printStackTrace();
        }

        try {

            // set the API request
            request = new HashMap<String, String>();
            request.put(new String("CetegoryCode"), "PIZ");
            request.entrySet().iterator();

            // Store locations in JSON
            requestJson = new JSONObject(request);
            httpClient = new DefaultHttpClient();
            httpPost = new HttpPost(path);
            requestString = new StringEntity(requestJson.toString());

            // sets the post request as the resulting string
            httpPost.setEntity(requestString);
            httpPost.setHeader("Content-type", "application/json");

            // Handles the response
            responseHandler = new BasicResponseHandler();
            response = httpClient.execute(httpPost, responseHandler);

            responseJson = new JSONArray(response);
            // System.out.println("*****JARRAY*****" + responseJson.length());

        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        try {
            responseJson = new JSONArray(response);

        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        return responseJson;

    }

    @Override
    protected void onPostExecute(JSONArray result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        listener.onTaskCompleted(responseJson);

    }
}
片段类

public class PizzaFragment extends ListFragment implements OnTaskCompleted {

private QuickReturnListView mListView;
private TextView mQuickReturnView;
private TextView mQuickReturnView1;
private TextView mQuickReturnView2;
private int mQuickReturnHeight;

private static final int STATE_ONSCREEN = 0;
private static final int STATE_OFFSCREEN = 1;
private static final int STATE_RETURNING = 2;
private int mState = STATE_ONSCREEN;
private int mScrollY;
private int mMinRawY = 0;

private TranslateAnimation anim;

GridView grid;
String[] web = { "Pizza1", "Pizza2", "Pizza3", "Pizza4", "Pizza5",
        "Pizza6", "Pizza7", "Pizza8", "Pizza9", "Pizza10", "Pizza11",
        "Pizza12", "Pizza13", "Pizza14", "Pizza15"

};
int[] imageId = { R.drawable.image1, R.drawable.image2, R.drawable.image3,
        R.drawable.image4, R.drawable.image5, R.drawable.image6,
        R.drawable.image7, R.drawable.image8, R.drawable.image9,
        R.drawable.image10, R.drawable.image11, R.drawable.image12,
        R.drawable.image13, R.drawable.image14, R.drawable.image15

};

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.menu_grid_main, container, false);

    new PizzaMenuAsyncTask(getActivity()).execute();

    mQuickReturnView = (TextView) view.findViewById(R.id.footer);
    mQuickReturnView1 = (TextView) view.findViewById(R.id.footer1);
    mQuickReturnView2 = (TextView) view.findViewById(R.id.footer2);

    CustomGrid adapter = new CustomGrid(getActivity(), web, imageId);
    grid = (GridView) view.findViewById(R.id.grid);
    grid.setAdapter(adapter);
    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    mListView = (QuickReturnListView) getListView();
    String[] array = new String[] { "Android1", "Android2", "Android",
            "Android", "Android", "Android", "Android", "Android",
            "Android", "Android", "Android", "Android", "Android",
            "Android", "Android", "Android5" };

    // setListAdapter(new ArrayAdapter<String>(getActivity(),
    // R.layout.menu_list_item, R.id.text1, array));

    mListView.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    mQuickReturnHeight = mQuickReturnView.getHeight();
                    mQuickReturnHeight = mQuickReturnView1.getHeight();
                    mQuickReturnHeight = mQuickReturnView2.getHeight();
                    mListView.computeScroll();
                    // mListView.computeScrollY();
                }
            });

    mListView.setOnScrollListener(new OnScrollListener() {
        @SuppressLint("NewApi")
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {

            mScrollY = 0;
            int translationY = 0;

            if (mListView.scrollYIsComputed()) {
                mScrollY = mListView.getComputedScrollY();
            }

            int rawY = mScrollY;

            switch (mState) {
            case STATE_OFFSCREEN:
                if (rawY >= mMinRawY) {
                    mMinRawY = rawY;
                } else {
                    mState = STATE_RETURNING;
                }
                translationY = rawY;
                break;

            case STATE_ONSCREEN:
                if (rawY > mQuickReturnHeight) {
                    mState = STATE_OFFSCREEN;
                    mMinRawY = rawY;
                }
                translationY = rawY;
                break;

            case STATE_RETURNING:

                translationY = (rawY - mMinRawY) + mQuickReturnHeight;

                System.out.println(translationY);
                if (translationY < 0) {
                    translationY = 0;
                    mMinRawY = rawY + mQuickReturnHeight;
                }

                if (rawY == 0) {
                    mState = STATE_ONSCREEN;
                    translationY = 0;
                }

                if (translationY > mQuickReturnHeight) {
                    mState = STATE_OFFSCREEN;
                    mMinRawY = rawY;
                }
                break;
            }

            /** this can be used if the build is below honeycomb **/
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB) {
                anim = new TranslateAnimation(0, 0, translationY,
                        translationY);
                anim.setFillAfter(true);
                anim.setDuration(0);
                mQuickReturnView.startAnimation(anim);
                mQuickReturnView1.startAnimation(anim);
                mQuickReturnView2.startAnimation(anim);
            } else {
                mQuickReturnView.setTranslationY(translationY);
                mQuickReturnView1.setTranslationY(translationY);
                mQuickReturnView2.setTranslationY(translationY);
            }

        }

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
        }
    });
}

@Override
public void onTaskCompleted(JSONArray responseJson) {
    // TODO Auto-generated method stub
    try {

        for (int n = 0; n < responseJson.length(); n++) {
            JSONObject object = responseJson.getJSONObject(n);
            if ((object.getString("MainCategoryID")).equals("1")) {
                Log.i("MainCategoryID ", object.getString("ItemCode"));

            }
        }

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
公共类PizzaFragment扩展ListFragment实现OnTaskCompleted{
私有QuickReturnListView mListView;
私有文本视图mQuickReturnView;
私有文本视图mQuickReturnView1;
私有文本视图mQuickReturnView2;
私有int mQuickReturnHeight;
屏幕上的私有静态最终int状态=0;
私有静态最终int状态_OFFSCREEN=1;
私有静态最终int状态_返回=2;
private int mState=屏幕上的状态;
私家车;
私有整数mMinRawY=0;
私人翻译动画;
网格视图网格;
字符串[]web={“Pizza1”、“Pizza2”、“Pizza3”、“Pizza4”、“Pizza5”,
“披萨6”、“披萨7”、“披萨8”、“披萨9”、“披萨10”、“披萨11”,
“比萨12”、“比萨13”、“比萨14”、“比萨15”
};
int[]imageId={R.drawable.image1,R.drawable.image2,R.drawable.image3,
R.drawable.image4,R.drawable.image5,R.drawable.image6,
R.drawable.image7,R.drawable.image8,R.drawable.image9,
R.drawable.image10,R.drawable.image11,R.drawable.image12,
R.drawable.image13,R.drawable.image14,R.drawable.image15
};
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.menu\u grid\u main,container,false);
新建PizzaMenuAsyncTask(getActivity()).execute();
mQuickReturnView=(TextView)view.findViewById(R.id.footer);
mQuickReturnView1=(TextView)view.findViewById(R.id.footer1);
mQuickReturnView2=(TextView)view.findViewById(R.id.footer2);
CustomGrid adapter=新的CustomGrid(getActivity(),web,imageId);
grid=(GridView)view.findviewbyd(R.id.grid);
设置适配器(适配器);
返回视图;
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
mListView=(QuickReturnListView)getListView();
字符串[]数组=新字符串[]{“Android1”、“Android2”、“Android”,
“安卓”、“安卓”、“安卓”、“安卓”、“安卓”,
“安卓”、“安卓”、“安卓”、“安卓”、“安卓”,
“Android”、“Android”、“Android5”};
//setListAdapter(新的ArrayAdapter(getActivity()),
//R.layout.menu_list_项,R.id.text1,数组);
mListView.getViewTreeObserver().addOnGlobalLayoutListener(
新建ViewTreeObserver.OnGlobalLayoutListener(){
@凌驾
公共图书馆{
mQuickReturnHeight=mQuickReturnView.getHeight();
mQuickReturnHeight=mQuickReturnView1.getHeight();
mQuickReturnHeight=mQuickReturnView2.getHeight();
mListView.computeScroll();
//mListView.computeScroly();
}
});
mListView.setOnScrollListener(新的OnScrollListener(){
@SuppressLint(“新API”)
@凌驾
public void onScroll(AbsListView视图,int firstVisibleItem,
int visibleItemCount,int totalItemCount){
mScrollY=0;
int translationY=0;
if(mListView.scrollysComputed()){
mScrollY=mListView.getComputedScrollY();
}
int rawY=mScrollY;
开关(mState){
屏幕外的案例状态:
如果(rawY>=mMinRawY){
mMinRawY=rawY;
}否则{
mState=返回的状态;
}
translationY=rawY;
打破
屏幕上的案例状态:
if(rawY>mQuickReturnHeight){
mState=屏幕外的状态;
mMinRawY=rawY;
}
translationY=rawY;
打破
案例状态返回:
translationY=(rawY-mMinRawY)+mQuickReturnHeight;
系统输出打印LN(翻译Y);
如果(平移Y<0){
平移Y=0;
mMinRawY=rawY+mQuickReturnHeight;
}
if(rawY==0){
mState=屏幕上的状态;
平移Y=0;
}
if(translationY>mQuickReturnHeight){
mState=屏幕外的状态;
mMinRawY=rawY;
}
打破
}
/**如果构建低于蜂巢,则可以使用此选项**/
如果(Build.VERSION.SDK_INT

@Override
protected void onPostExecute(JSONArray result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);

    listener.onTaskCompleted(result);

}     

doInBackground返回的JSONArray作为其JSONArray结果传递给onPostExecute。

注意,您有两个构造函数,如果您调用第一个构造函数来获取您的
PizzaMenuAsyncTask的实例,那么当您调用
listener.onTaskCompleted(结果)时,您的侦听器将为空在您的
onPostExecute(JSONArray结果)
方法中

更新:

解决方案正在更改第一个构造函数,如下所示:

public PizzaMenuAsyncTask(Context context, OnTaskCompleted listener) {

    // API = apiURL;
    this.contxt = context;
    this.listener = listener;
}
并更改行:

new PizzaMenuAsyncTask(getActivity()).execute();
致:


这里的侦听器“listener.onTaskCompleted(responseJson)”;“为空,那么如何启动PizzaMenuAsyncTask?”如何启动PizzaMenuAsyncTask?我知道了,那么如何获得PizzaMenuAsyncTask的实例?请发布代码?@leog我在问题(上一个代码示例)中提到过这一点。public void onTaskCompleted(JSONArray responseJson){正如上面提到的,必须是构造函数所以解决方案是什么,我使用第一个构造函数从片段执行asyntask。我已经发布了我的完整代码,你能检查并纠正我的错误吗基本上我只想从asyntask onPos发送数据
new PizzaMenuAsyncTask(getActivity()).execute();
new PizzaMenuAsyncTask(getActivity(), this).execute();