Android使用volley的一个空指针问题
使用了volley的listview,但是直接停止运行。
小弟看了一天,还是不明白,问题出在哪里,求指点
错误提示:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xd.v2ex, PID: 32632
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xd.v2ex/com.xd.v2ex.activity.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.xd.v2ex.utils.ApplicationController.addToRequestQueue(com.android.volley.Request)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2702)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)
at android.app.ActivityThread.access$900(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5981)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.xd.v2ex.utils.ApplicationController.addToRequestQueue(com.android.volley.Request)' on a null object reference
at com.xd.v2ex.activity.MainActivity.fetchMovies(MainActivity.java:116)
at com.xd.v2ex.activity.MainActivity.onCreate(MainActivity.java:79)
at android.app.Activity.performCreate(Activity.java:6289)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)
at android.app.ActivityThread.access$900(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5981)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
MainActivity
package com.xd.v2ex.activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.util.Log;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.xd.v2ex.R;
import com.xd.v2ex.adapter.LatestAdapter;
import com.xd.v2ex.bean.ItemInfo;
import com.xd.v2ex.utils.ApplicationController;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private static final String TAG = MainActivity.class.getSimpleName();
private ArrayList<ItemInfo> itemInfos;
private LatestAdapter latestAdapter;
private ListView latestListView;
private static final String url = "http://www.v2ex.com/api/topics/latest.json";
private ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
/**
listview
*/latestListView = (ListView) findViewById(R.id.latestListView); itemInfos = new ArrayList<ItemInfo>(); fetchMovies(); latestAdapter = new LatestAdapter(MainActivity.this, itemInfos); latestListView.setAdapter(latestAdapter);
}
void fetchMovies() {
JsonArrayRequest req = new JsonArrayRequest(url, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray jsonArray) { for (int i = 0; i < jsonArray.length(); i++) { try { JSONObject object=jsonArray.getJSONObject(i); ItemInfo itemInfo=new ItemInfo(); itemInfo.setTitle(object.getString("title")); itemInfo.setImage("http:"+object.getJSONObject("member").getString("avatar_large")); itemInfo.setNode(object.getString("created")); itemInfo.setAuthor(object.getString("id")); itemInfos.add(itemInfo); } catch (JSONException e) { e.printStackTrace(); } } //ע��ˢ������ latestAdapter.notifyDataSetChanged(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Log.e(TAG, "error:" + volleyError.getMessage()); } }); ApplicationController.getInstance().addToRequestQueue(req);
}
@Override
void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); }
}
@Override
boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true;
}
@Override
boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Overrideboolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here. int id = item.getItemId(); if (id == R.id.nav_camera) { // Handle the camera action } else if (id == R.id.nav_gallery) { } else if (id == R.id.nav_slideshow) { } else if (id == R.id.nav_manage) { } else if (id == R.id.nav_share) { } else if (id == R.id.nav_send) { } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
把fetchMovies()方法调用放到latestListView.setAdapter之后
ApplicationController.getInstance().addToRequestQueue(req); 既然是这句报错了,你就验证下前后是否是null的,打印下ApplicationController.getInstance() 和 req 这两个,在调用前,不过看你req是在上面重新new的一个,所以ApplicationController.getInstance()这个为null的可能性比较大。
我快哭了…………我也是遇到这个问题,哥你是怎么解决的??? 跪求……