Android 在带有RecyclerViews和Fragments的应用程序中使用截击-烘焙应用程序

Android 在带有RecyclerViews和Fragments的应用程序中使用截击-烘焙应用程序,android,Android,在我为测试截击而制作的一个简单玩具应用程序中,我可以轻松地从Udacity提供的链接中检索JSON数据,以便在其烘焙应用程序中使用。 然而,在我实际的烘焙应用程序中,我似乎无法使用截击。从日志来看,似乎Volley实际上并没有从链接中检索JSON,即使在我的玩具应用程序中使用了相同的代码 MainActivity.java: package com.example.android.bakingapp; import android.content.Intent; import android.

在我为测试截击而制作的一个简单玩具应用程序中,我可以轻松地从Udacity提供的链接中检索JSON数据,以便在其烘焙应用程序中使用。 然而,在我实际的烘焙应用程序中,我似乎无法使用截击。从日志来看,似乎Volley实际上并没有从链接中检索JSON,即使在我的玩具应用程序中使用了相同的代码

MainActivity.java:

package com.example.android.bakingapp;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.android.bakingapp.dummy.DummyContent;

public class MainActivity extends AppCompatActivity implements RecipeListFragment.OnListFragmentInteractionListener {

    String json;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Instantiate the RequestQueue.
        RequestQueue queue = Volley.newRequestQueue(this);
        String url = "https://d17h27t6h515a5.cloudfront.net/topher/2017/May/59121517_baking/baking.json";

// Request a string response from the provided URL.
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        json = response;
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                json="";
            }
        });

// Add the request to the RequestQueue.
        queue.add(stringRequest);
        RecipeJson.setJsonData(json);

        RecipeListFragment recipeListFragment = new RecipeListFragment();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .add(R.id.container, recipeListFragment)
                .commit();
    }

    @Override
    public void onListFragmentInteraction(DummyContent.DummyItem item) {
        Intent intent = new Intent(this, RecipeDetails.class);
        intent.putExtra("id", item.id);
        RecipeDetails.counter = 0;
        startActivity(intent);
    }
}
日志:

日志表明jsonData中没有存储任何内容。
但为什么呢?

正如@prashant17所提到的,onResponse()是异步的。这意味着放置在stringRequest之后的任何代码都可以在jsonRequest执行之前执行。因此,所有使用字符串json的代码都必须放在onResponse中。这包括您的片段事务


与您提供的罪魁祸首代码行相关,请小心将抽象类引用传递给JSONArray构造函数,而不是传递其数据先前已设置的对象的实例。你的代码看起来像是在做前者。

移动你的
RecipeJson.setJsonData(json)内部
onResponse


因为截击是异步的。在当前实现中,
json字符串
始终为
null

发布“RecipeListFragment”
package com.example.android.bakingapp;

public class RecipeJson {
    public static String jsonData;
    public static void setJsonData(String json){
        jsonData=json;
    }
}
08-09 23:09:35.050 2181-2181/com.example.android.bakingapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.android.bakingapp, PID: 2181
    java.lang.ExceptionInInitializerError
        at com.example.android.bakingapp.RecipeListFragment.onCreateView(RecipeListFragment.java:68)
        at android.support.v4.app.Fragment.performCreateView(Fragment.java:2346)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1428)
        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2596)
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383)
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245)
        at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3248)
        at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3200)
        at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:195)
        at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:597)
        at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1382)
        at android.app.Activity.performStart(Activity.java:7151)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2949)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:194)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:180)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:157)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:72)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1800)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6649)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
        at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
        at org.json.JSONTokener.nextValue(JSONTokener.java:94)
        at org.json.JSONArray.<init>(JSONArray.java:92)
        at org.json.JSONArray.<init>(JSONArray.java:108)
        at com.example.android.bakingapp.dummy.DummyContent.makeJsonArray(DummyContent.java:55)
        at com.example.android.bakingapp.dummy.DummyContent.<clinit>(DummyContent.java:28)
        at com.example.android.bakingapp.RecipeListFragment.onCreateView(RecipeListFragment.java:68) 
        at android.support.v4.app.Fragment.performCreateView(Fragment.java:2346) 
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1428) 
        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759) 
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827) 
        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797) 
        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2596) 
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383) 
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338) 
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245) 
        at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3248) 
        at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3200) 
        at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:195) 
        at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:597) 
        at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177) 
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1382) 
        at android.app.Activity.performStart(Activity.java:7151) 
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2949) 
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:194) 
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:180) 
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:157) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:72) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1800) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6649) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826) 
jsonArray = new JSONArray(RecipeJson.jsonData);