即使在初始化对象之后仍然为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。
当您执行AsyncTask时,该操作与UI线程同时在后台线程上运行。 Log语句恰好在execute语句之后,所以当Log语句执行时,AsyncTask尚未将变量中的信息加载。
谢谢你的澄清rhari,我仍然很难把握我想要的内容。那么我将如何执行所需的任务?正如我之前提到的那样,当不在片段内部时,这通常起作用。这让我很困惑。 –
如果要访问onCreateView方法中的返回变量,除非使用execute()而不使用enqueue(),否则将不可能。你应该根据你想要的结果进行onResponse回调。您还可以使用BroadcastReceiver将结果发送回主线程并在那里执行自定义代码。 – rhari
实际工作和其他代码正常工作。在这种情况下,我想要做的是将请求的内容解析到适配器中,然后再解析回收器视图。它运行,但是当我转动屏幕时,状态不会被保存,并且由于适配器在异步调用中被添加和执行,它记录了没有连接适配器。 –
你能确切指定你得到一个空指针吗? – saml
提示:有一件事:你**从来没有**去**空** catch块。这些表明**错误**并忽略错误很少有帮助。 Plus:您想提供完整的异常堆栈跟踪。 – GhostCat
@Sam绝对是在我登录onCreateview方法时的信息 –