Android 从AsyncTask向片段(非活动)发送数据
我已经将jsonresponse数组数据带到了onPostExecute,现在我想将jsonresponse传递给主片段。但当我尝试时,它给出了一个错误,如图所示。我已经明白了这个答案,任何帮助都将是巨大的 异步任务类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
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();