2012-08-15 22 views
0

因此,我使用JSON Parser解析JSONObject,并使用AsyncTask将该数据放入多个对象中。我的问题是:我将如何通过所有这些对象?他们都是Serializable,我读过你可以创建一个Intent并使用putExtras方法将对象放入Intent;但是,当我这样做时,我得到一个错误。使用AsyncTask传递可串行化的对象

另外,为了创建所有对象,我在原始构造函数中使用构造函数调用每个不同对象的构造函数。所以我可以调用一个构造函数,并且该构造函数使用第一个构造函数中的方法调用其他构造函数。我知道这可能听起来有点令人困惑,但最终解析器创建了8个不同的对象,我想传递给下一个活动。

我接受任何有关如何做到这一点的建议。

编辑:我不想使用Parcelable它对于我想要做的事情来说太复杂了,我不担心速度,因为我的文件很小。

@Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     this.setContentView(R.layout.main); 

     checkWifiConnection(menuUrl); 

    } 




    class LoadJSON extends AsyncTask<String, Void, Restaurant>{ 

     @Override 
     protected Restaurant doInBackground(String... params) { 
      JSONObject jo=null; 
      Restaurant rest = null; 

      try { 

       Log.i(TAG, "Running background thread"); 
       URL mURL = new URL(menuUrl); 
       Log.i(TAG, mURL + ": menuUrl"); 
       URLConnection uc = mURL.openConnection(); 


       JsonParser parser = new JsonParser(); 

       try { 
        jo = parser.getJson(getApplicationContext(), uc); 
        rest = new Restaurant(jo); <<-- Start the parsing using this constructor, which calls the other objects constructors 
       } catch (IOException e) { 

        e.printStackTrace(); 
       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 



      } catch (MalformedURLException e) { 

       e.printStackTrace(); 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 
      return rest; 
     } 

     @Override 
     protected void onPostExecute(Restaurant rest){ 

      ImageButton ib = (ImageButton)findViewById(R.id.continuebutton); 
      ib.setVisibility(View.VISIBLE); 
      ib.setOnClickListener(new View.OnClickListener() { 

       public void onClick(View v) { 
        Intent homeIntent = new Intent(MainActivity.this, HomeActivity.class); 
        homeIntent.putExtra("Restaurant", rest); //<< get an error here 
        startActivity(homeIntent); 


       } 
      }); 

     } 

这里是Restaurant类:

package com.uie.menu.app; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.util.Log; 

public class Restaurant implements Serializable { 

    private final static String TAG = Restaurant.class.getSimpleName(); 

    String name; 
    String category; 
    String created_at; 
    String updated_at; 
    private List<Menu> menuList; 
    private List<SideDishes> sideDishes; 
    private List<Drinks> drinks; 
    private List<Ingredients> ingredients; 
    private List<DrinkCategories> drinkCategories; 

    private Restaurant() { 
     menuList = new ArrayList<Menu>(); 
     sideDishes = new ArrayList<SideDishes>(); 
     drinks = new ArrayList<Drinks>(); 
     ingredients = new ArrayList<Ingredients>(); 
     drinkCategories = new ArrayList<DrinkCategories>(); 
    } 

    public Restaurant(JSONObject jo) throws JSONException { 

     this(); 

     if (jo != null) { 

      this.name = jo.optString("name"); 
      Log.i(TAG, name + " : Restaurant 'name'"); 
      this.category = jo.optString("category"); 
      Log.i(TAG, category + " : Restaurant category"); 
      this.created_at = jo.optString("created_at"); 
      Log.i(TAG, created_at + " : Restaurant 'created at'"); 
      this.updated_at = jo.optString("updated_at"); 
      Log.i(TAG, updated_at + " : Restaurant 'updated_at'"); 

      addMenus(jo); 
      addMenuSides(jo); 
      addMenuDrinks(jo); 
      addMenuIngredients(jo); 
      addDrinkCategories(jo); 

     } 

    } 

    private void addMenus(JSONObject jo) throws JSONException { 
     JSONArray menus = jo.optJSONArray("menus"); 

     if (menus != null) { 
      for (int ii = 0; menus != null && ii < menus.length(); ii++) { 
       JSONObject menu = menus.optJSONObject(ii); 
       Log.d(TAG, "==Adding Restaurant Menu=="); 
       addMenu(new Menu(menu)); 
      } 
      Log.d(TAG, "==Done adding Restaurant Menu=="); 
     } 
    } 

    private void addMenu(Menu menu) { 
     menuList.add(menu); 
    } 

    private void addMenuSides(JSONObject jo) throws JSONException{ 
     JSONArray sides = jo.optJSONArray("side_dishes"); 

     if (sides != null) { 
      for (int ii = 0; sides != null && ii < sides.length(); ii++) { 
       JSONObject side = sides.optJSONObject(ii); 
       Log.d(TAG, "==Adding Restaurant Side Dish=="); 
       addSide(new SideDishes(side)); 
      } 
      Log.d(TAG, "==Done adding Restaurant Side Dishes=="); 
     } 
    } 

    private void addSide(SideDishes side){ 
     sideDishes.add(side); 
    } 

    private void addMenuDrinks(JSONObject jo) throws JSONException{ 
     JSONArray drinks = jo.optJSONArray("drinks"); 

     if (drinks != null) { 
      for (int ii = 0; drinks != null && ii < drinks.length(); ii++) { 
       JSONObject drink = drinks.optJSONObject(ii); 
       Log.d(TAG, "==Adding Restaurant Drinks=="); 
       addDrink(new Drinks(drink)); 
      } 
      Log.d(TAG, "==Done adding Restaurant Drinks=="); 
     } 
    } 

    private void addDrink(Drinks drink){ 
     drinks.add(drink); 
    } 

    private void addMenuIngredients(JSONObject jo){ 
     JSONArray ingredients = jo.optJSONArray("ingredients"); 

     if (ingredients != null) { 
      Log.d(TAG, "==Adding Restaurant Ingredient=="); 
      for (int ii = 0; ingredients != null && ii < ingredients.length(); ii++) { 
       JSONObject ingredient = ingredients.optJSONObject(ii); 

       addIngredient(new Ingredients(ingredient)); 
      } 
      Log.d(TAG, "==Done adding Restaurant Ingredients=="); 
     } 
    } 

    private void addIngredient(Ingredients ingredient){ 
     ingredients.add(ingredient); 
    } 

    private void addDrinkCategories(JSONObject jo) throws JSONException{ 
     JSONArray drinkCategories = jo.optJSONArray("drink_categories"); 

     if (drinkCategories != null) { 
      Log.d(TAG, "==Adding Restaurant Drink Categories=="); 
      for (int ii = 0; drinkCategories != null && ii < drinkCategories.length(); ii++) { 
       JSONObject drinkCategory = drinkCategories.optJSONObject(ii); 

       addCategory(new DrinkCategories(drinkCategory)); 
      } 
      Log.d(TAG, "==Done adding Restaurant Drink Categories=="); 
     } 
    } 

    private void addCategory(DrinkCategories drinkCategory){ 
     drinkCategories.add(drinkCategory); 
    } 
} 

有错误,我得到的是:Cannot refer to a non-final variable rest inside an inner class defined in a different method

+0

您是否试图宣布休息为最终? – 2012-08-15 22:45:17

+0

是的。这不起作用。 – BlackHatSamurai 2012-08-15 22:45:53

回答

0

餐厅应实现Parcelable,它的对象传递给来自意图另一个活动的最佳方式。

编辑:您以后可能会遇到另一个bug,与您相关的Serializable餐厅中的列表。它的解释here

+0

我不想使用'Parcelable',因为我有8个不同的对象,实现这个对象很复杂。这就是我使用'Serializable'的原因。 – BlackHatSamurai 2012-08-15 22:20:04

+0

好的,我们可以看看你的餐厅类和错误消息吗? – 2012-08-15 22:27:13

+0

完成。我已更新信息 – BlackHatSamurai 2012-08-15 22:36:51

0

尝试在LoadJSON的类范围内声明您的休息对象,而不是在doInBackground方法内部。例如

class LoadJSON extends AsyncTask<String, Void, Restaurant>{ 
    Restaurant rest = null; 

    private void doInBackground(...) { 
     ... 
    } 
} 
+0

这不会有什么区别。我发现我不得不在''onPostExecute'方法'final'的'Restaurant'参数中声明。 – BlackHatSamurai 2012-08-15 23:03:45