0

そのため、 を使用して を解析し、JSONObjectを使用してJSON Parserそのデータを複数のオブジェクトに入れていますAsyncTask。私の質問は次のとおりです。これらすべてのオブジェクトをどのように渡すのですか? それらはすべてであり、メソッドを使用して を作成し、オブジェクトを に入れるSerializableことができることを読みました。ただし、これを行うとエラーが発生します。IntentIntentputExtras

また、すべてのオブジェクトを作成するために、元のコンストラクターでコンストラクターを使用して、さまざまなオブジェクトのそれぞれのコンストラクターを呼び出します。したがって、最初のコンストラクター内のメソッドを使用して、1 つのコンストラクターを呼び出し、そのコンストラクターが他のコンストラクターを呼び出すことができます。少し混乱するかもしれませんが、最終的にパーサーは、次のアクティビティに渡したい 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

4

2 に答える 2

0

RestaurantはParcelableを実装する必要があります。これは、オブジェクトをIntentから別のアクティビティに渡すための最良の方法です。

編集: SerializableRestaurant内のリストに関連する別のバグが後で発生する可能性があります。ここで説明します

于 2012-08-15T22:19:10.633 に答える
0

doInBackground メソッド内ではなく、LoadJSON のクラス スコープで残りのオブジェクトを宣言してみてください。例えば

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

    private void doInBackground(...) {
       ...
    }
}
于 2012-08-15T22:50:40.330 に答える