Я создаю фоновый сервер и приложение для Android для проекта заказа еды.Существует функция, которая помогает клиентам убедиться, занят ли стол или нет.Логика написана в TableActivity.java, который я покажу ниже.В основном, элемент для надувания представления - это ImageView и TextView.ImageView либо свободен, либо занят, а TextView - это номер таблицы.Фоновый код в порядке, который возвращает строку json, которая содержит номер таблицы и флаг таблицы (1 вакантно; 0 занято).Но LogCat дал мне исключение нулевого указателя.Буду признателен, если вы дадите несколько советов.
Я использую tomcat 7 в качестве серверного программного обеспечения и сервлета для обработки соединения между клиентом и базой данных.Фон в порядке, и я думаю, что проблема в моих кодах клиента Android.Версия Android SDK - 27.
public class TableActivity extends Activity {
GridView gv;
List<Table> list;
MyAdapter myAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.table);
list = new ArrayList<Table>(); //Table is an Entity class
gv = findViewById(R.id.table_gridView);
myAdapter = new MyAdapter();
//init network
String url = "http://10.0.2.2:8080/WL_Server/TableServlet";
new MyTask().execute(url);
gv.setAdapter(myAdapter);
}
/*@param: The url of server servlet
Visit target url, gets the output of the server. The function returns a json that contains info of Tabletbl table.
* */
String doGetTableMsg(String url){
String json = OkHttpUtil.doGet(url);
return json;
}
//异步任务,处理网络请求
class MyTask extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... strings) {
return doGetTableMsg(strings[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Gson gson = new Gson();
Type type = new TypeToken<List<Table>>(){}.getType();
list = gson.fromJson(s, type);
myAdapter.notifyDataSetChanged();
}
}
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
//This return sentence is where the exception happened. But this
// list object has been initiated and assigned with value already?
return list.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View view1;
if (view == null){
//Inflate a view from an XML resource.
view1 = View.inflate(getApplicationContext(), R.layout.table_item, null);
}else {
view1 = view;
}
ImageView imageView1 = view1.findViewById(R.id.itemImageView1);
TextView textView1 = view1.findViewById(R.id.itemTextView1);
//Logic to decide whether table is vacant or not. Totally fine.
Table table = list.get(i);
int flag = table.getFlag();
if (flag == 0){
imageView1.setImageResource(R.drawable.kongwei);
}else {
imageView1.setImageResource(R.drawable.youren);
}
textView1.setText(table.getTid() + "");
return view1;
}
}
}
Я ожидаю, что эмулятор покажет вид, но он дал мне исключение нулевого указателя, как показано ниже:
java.lang.NullPointerException: Попытка вызвать метод интерфейсаint java.util.List.size () для пустой ссылки на объект по адресу xuming.com.wl_client.TableActivity $ MyAdapter.getCount (TableActivity.java:82)
Строка 82 равна return list.size();
Обычная причина, по которой это происходит, - это использование [findViewById] вместо [View.findViewById] в методе getItem, но я уже использовал последний.Ценю, и если вам нужно больше кодов, я предоставлю.