即使在初始化对象之后仍然为null对象引用

问题描述:

我正在尝试尽我所能为我尝试创建的特定项目使用片段。我正在创建一个片段类中的所有网络调用。当我调用建立连接的方法并将结果记录到控制台时,我从类中获取所有信息,但是当我尝试访问网络调用之外的实例时,我得到一个空指针异常。 我一直在看文档和其他例子,但其中大多数做的事情与我需要的不同,并且文档没有提及使用okhttp里面的片段。即使在初始化对象之后仍然为null对象引用

,我使用的代码是这样的:

public void testAsyncCreate() { 

     OkHttpClient client = new OkHttpClient(); 


     RequestBody body = RequestBody.create(CREATE_MEDIA_TYPE, "data={\"process\":\"123\", \"phone\":\"111111111\"}"); 


     Request request = new Request.Builder() 
       .url(ALLWAYS_API) 
       .post(body) 
       .build(); 

     Call call = client.newCall(request); 

     call.enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 

      } 

      @Override 
      public void onResponse(Call call, Response response) throws IOException { 
       // any additional runnable items go in here 
       try { 


        String jsonData = response.body().string(); // the exception is caught at this point 
        Log.d("<Mensajes>",jsonData); 
        //extractCreate = parseExtractCreateDetails(jsonData); 
        if(response.isSuccessful()) { 
         extractCreate = parseExtractCreateDetails(jsonData); 
         getActivity().runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           Log.d("<=====>", "check"); 
           Log.d(TAG, "Is this even working?"); 
           Log.d("The class has been ok",extractCreate.getCreateR().getAccount_id().toString()); 
           Log.d("Another check", extractCreate.getStopsR()[1].getAddress()); 



          } 
         }); 
        } 

        //getStops(jsonData); 

       }catch(IOException e) { 

       }catch (JSONException e){ 

       } 


      } 
     }); 
    } // end of asyncCreate 

然后onCreateView()方法中:

ExtractCreate extractCreate = new ExtractCreate(); 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     View view = inflater.inflate(R.layout.fragments_stops_list, container, false); 
     ButterKnife.bind(this, view); 

     if (savedInstanceState == null) { 
       testAsyncCreate(); 
     } 
     Log.d("<extractCreateCheck>", String.valueOf(extractCreate.getCreateR().getAccount_id())); 

     return view: 
    } 

我不能弄清楚为什么使用片段时,这是不工作时,我之所以这样说,是因为如果我想把它放在一个常规活动中并运行它,我就能够在我想要的任何地方使用extractCreate的结果,而不是在这里。有没有我缺少关于在片段中使用okhttp调用的步骤?目前这些文档对我来说没有任何意义。 堆栈跟踪如下:

11-23 09:28:55.569 3288-3288/com.example.testC.demotrackertree E/AndroidRuntime: FATAL EXCEPTION: main                     
     Process: com.example.testC.demotrackertree, PID: 11142 
     java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String at com.example.testC.demotrackertree.models.createmodels.CreateResponse.getAccount_id()' on a null object reference 
     at com.example.testC.demotrackertree.ui.fragments.StopCreateFragment.onCreateView(StopCreateFragment.java:95) 
     at android.app.Fragment.performCreateView(Fragment.java:2353) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:995) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171) 
     at android.app.BackStackRecord.run(BackStackRecord.java:816) 
     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578) 
     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:483) 
     at android.os.Handler.handleCallback(Handler.java:751) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:154) 
     at android.app.ActivityThread.main(ActivityThread.java:6119) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

作为一个哥们的建议,我做了什么,我想相应的响应里面做,

if(response.isSuccessful()) { 
         extractCreate = parseExtractCreateDetails(jsonData); 
         getActivity().runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
//        Log.d("<=====>", "check"); 
//        Log.d(TAG, "Is this even working?"); 
//        Log.d("The class has been ok",extractCreate.getCreateR().getAccount_id().toString()); 
//        Log.d("Another check", extractCreate.getStopsR()[1].getAddress()); 
           Parcelable[] parcelable = extractCreate.getStopsR(); 

           commodities = Arrays.copyOf(parcelable, parcelable.length, Stops[].class); 
           //Log.d("Commodities size check", String.valueOf(commodities.length)); 


           StopsAdapter adapter = new StopsAdapter(extractCreate.getStopsR()); 
           mRecyclerView.setAdapter(adapter); 
           RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); // sketchy on this part 
           mRecyclerView.setLayoutManager(layoutManager); 
           mRecyclerView.setHasFixedSize(true); 
           Log.d(TAG, "This is being called from the onCreate method"); 
           //(); 



          } 
         }); 
        } 

        //getStops(jsonData); 

       }catch(IOException e) { 

       }catch (JSONException e){ 

       } 


      } 

现在的视图更新的内容,我在我的适配器指定的(意味着适配器充当我意),但被该适配器不会添加,直到回调结束的堆栈跟踪打印出

11-23 12:05:40.628 7270-7270/com.example.testC.demotrackertree E/RecyclerView: No adapter attached; skipping layout 

而且不仅如此,而且在旋转屏幕时不保存saveInstanceState。

+1

你能确切指定你得到一个空指针吗? – saml

+0

提示:有一件事:你**从来没有**去**空** catch块。这些表明**错误**并忽略错误很少有帮助。 Plus:您想提供完整的异常堆栈跟踪。 – GhostCat

+0

@Sam绝对是在我登录onCreateview方法时的信息 –

当您执行AsyncTask时,该操作与UI线程同时在后台线程上运行。 Log语句恰好在execute语句之后,所以当Log语句执行时,AsyncTask尚未将变量中的信息加载。

+0

谢谢你的澄清rhari,我仍然很难把握我想要的内容。那么我将如何执行所需的任务?正如我之前提到的那样,当不在片段内部时,这通常起作用。这让我很困惑。 –

+0

如果要访问onCreateView方法中的返回变量,除非使用execute()而不使用enqueue(),否则将不可能。你应该根据你想要的结果进行onResponse回调。您还可以使用BroadcastReceiver将结果发送回主线程并在那里执行自定义代码。 – rhari

+0

实际工作和其他代码正常工作。在这种情况下,我想要做的是将请求的内容解析到适配器中,然后再解析回收器视图。它运行,但是当我转动屏幕时,状态不会被保存,并且由于适配器在异步调用中被添加和执行,它记录了没有连接适配器。 –