Java android活动中的NullPointerException
我创建了一个名为activity_category的布局和名为CategoryActivity的活动,其代码如下Java android活动中的NullPointerException,java,android,json,android-asynctask,Java,Android,Json,Android Asynctask,我创建了一个名为activity_category的布局和名为CategoryActivity的活动,其代码如下 public class CategoryActivity extends Activity { private LazyItemLoadAdapter adapter; private int[] selectionId; private Item[] item_data; private GridView grid; private Tex
public class CategoryActivity extends Activity {
private LazyItemLoadAdapter adapter;
private int[] selectionId;
private Item[] item_data;
private GridView grid;
private TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_category);
ActionBarUtils.setActionBar(this);
String id=getIntent().getExtras().getString("id");
try{
AsyncData data=new AsyncData();
data.execute(Constants.SERVER+"cat_adlist.php?id="+id);
grid = (GridView) findViewById(R.id.gridViewAllItems);
}catch(NotFoundException n){
}
}
private class AsyncData extends AsyncTask<String, Void, Item[]>{
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
setProgressBarIndeterminateVisibility(true);
}
@Override
protected Item[] doInBackground(String... params) {
String str=null;
try {
str = CustomHttpClient
.executeHttpGet(params[0]);
Log.i("Category Data", str);
JSONArray array = new JSONArray(str);
item_data = new Item[array.length()];
selectionId = new int[array.length()];
for (int i = 0; i < item_data.length; i++) {
JSONObject jdata = array.getJSONObject(i);
String path = Constants.THUMBS
+ jdata.getString("name");
int itemid = jdata.getInt("id");
item_data[i] = new Item(itemid, path, jdata.getString("title"),
jdata.getString("price"));
selectionId[i] = jdata.getInt("subcategory_id");// change the
// field name
// here
}
}catch(JSONException j){
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return item_data;
}
@Override
protected void onPostExecute(Item[] result) {
adapter = new LazyItemLoadAdapter(CategoryActivity.this, R.layout.text_below_images, result);
grid.setAdapter(adapter);
if (result.length == 0) {
grid.setVisibility(View.GONE);
textview.setVisibility(View.VISIBLE);
} else {
grid.setVisibility(View.VISIBLE);
textview.setVisibility(View.GONE);
}
TextView numResults=(TextView) findViewById(R.id.textView2);
numResults.setText("Found "+String.valueOf(result.length)+" results");
setProgressBarIndeterminateVisibility(false);
super.onPostExecute(result);
}
}
}
正如您所看到的,我得到了一个空指针异常。最初是因为我使用了错误的布局,但我已经纠正了,但问题仍然存在。请帮我提建议。提前感谢。您忘记初始化
TextView TextView
方法中的onPostExecute
了
@Override
protected void onPostExecute(Item[] result) {
TextView textview =(TextView) findViewById(R.id.textView2);
adapter = new LazyItemLoadAdapter(CategoryActivity.this, R.layout.text_below_images, result);
grid.setAdapter(adapter);
if (result.length == 0) {
grid.setVisibility(View.GONE);
textview.setVisibility(View.VISIBLE);
} else {
grid.setVisibility(View.VISIBLE);
textview.setVisibility(View.GONE);
}
TextView numResults=(TextView) findViewById(R.id.textView2);
numResults.setText("Found "+String.valueOf(result.length)+" results");
setProgressBarIndeterminateVisibility(false);
super.onPostExecute(result);
}
首先,我认为您应该遵循的最佳实践是将代码分块组织。在
setContentView()之后初始化所有视图,无论何时使用它们。如果你开始这样做,你就不会像现在这样抛出异常
代码中的问题是您没有初始化textView
变量并在onPostExecute()
异步任务的方法中使用它。您的onCreate
应该如下所示:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_category);
grid = (GridView) findViewById(R.id.gridViewAllItems);
textview = (TextView) findViewById(R.id.myTextView);
numResults = (TextView) findViewById(R.id.textView2);
// Start your AsyncTask here ...
}
哪一行是第115行?写出以下行grid=(GridView)findViewById(R.id.gridViewAllItems);在执行Async Task之前,代码中的哪一行是第115行(其中存在问题;也称为空元素)。还有几点:在初始化网格变量之前运行AsynTask;图像下方是否存在R.layout.text_。。。您需要学习如何调试应用程序。当在特定行引发NullPointerException时,这意味着此行中的一个元素从未初始化。查看Mat提供的链接。第115行超出范围。没有第115行。代码中只有105行。GridView已初始化,但他使用的TextView不是:TextView.setVisibility(View.VISIBLE)代码>确实textview未初始化。初始化它解决了这个问题@Android Developer你可以发布你的回复,这样我就可以选择它作为正确的答案吗?@Pankaj TextView已经初始化,但它在onPostExecute
中,它无法获取TextView
,因为它是在onPostExecute
方法中的if
循环之后初始化的。@GrIsHu实际上有两个TextView。正如您所说,一个在if块之后初始化,另一个在if块中从未初始化。无论如何,谢谢你。@Pankaj这就是错误所在。我已经提到,在onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_category);
grid = (GridView) findViewById(R.id.gridViewAllItems);
textview = (TextView) findViewById(R.id.myTextView);
numResults = (TextView) findViewById(R.id.textView2);
// Start your AsyncTask here ...
}