2015-01-26 3 views
0

Я принял данные массива jsonresponse для onPostExecute, теперь я хочу передать jsonresponse для основного фрагмента. но когда я пытаюсь, это дает ошибку, как показано на изображении. Я следую этому ответу (android asynctask sending callbacks to ui), любая помощь будет замечательной.Отправлять данные в Фрагмент (нет активности) из AsyncTask

AsyncTask класс

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 interface OnTaskCompleted { 
    void onTaskCompleted(JSONArray 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(); 
    } 
} 

} это ошибка, я получаю, когда я запустить приложение. то, что я пропустил в этом enter image description here

+0

Кажется, что ваш слушатель здесь «listener.onTaskCompleted (responseJson)»; null, так как вы начинаете свой PizzaMenuAsyncTask? –

+0

«как вы начинаете свою PizzaMenuAsyncTask?» – mmlooloo

+0

Я вижу, так как вы получаете экземпляр PizzaMenuAsyncTask? Пожалуйста, напишите код? –

ответ

0

Обратите внимание, что у вас есть два конструктора, если вы звоните первый, чтобы получить экземпляр вашего PizzaMenuAsyncTask, слушатель будет аннулирован, если вы звоните listener.onTaskCompleted(result); в методе onPostExecute(JSONArray result).

Update:

Решение меняет свой первый конструктор следующим образом:

public PizzaMenuAsyncTask(Context context, OnTaskCompleted listener) { 

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

И изменить строку:

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

к:

new PizzaMenuAsyncTask(getActivity(), this).execute(); 
+0

, так что же решение im использует 1-й конструктор для выполнения asyntask из фрагмента. Я опубликовал свой полный код, могу проверить и исправить свою ошибку. –

+0

В основном все, что я хочу, - это отправить данные из asyntask onPostExcute в класс фрагмента onTaskCompleted. –

+0

@JohnDavid Это работает? –

0

Это должно быть

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

    listener.onTaskCompleted(result); 

}  

JSONArray возвращается самая doInBackground передается onPostExecute в качестве результата JSONArray.

+0

Я получаю ту же ошибку –

+0

Как отмечал выше Leog, должны быть конструкторы – freddieptf

Смежные вопросы