我是Android开发的新手,我正在开发一个应用程序,该应用程序具有一个可以吸引杂货的模块。来自API的数据并使用改进显示它。我创造了一个' Groceries'与主要活动分开的活动。我试图在代码上实现线程,但是当我添加一个线程时我的应用程序崩溃了。没有Thread和Handler代码,它工作正常。问题似乎出现在两者中的任何一个。我做错了什么?
这个问题与问题"什么是NullPointerException不相似?"因为我在这段代码中要求帮助实现线程。
以下代码来自文件' GroceriesActivity.java'。
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.ArrayList;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class GroceriesActivity extends AppCompatActivity {
private ListView listView;
ArrayList<GroceryItem> grocery;
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
GroceryItemAdapter adapter = new GroceryItemAdapter(getApplicationContext(),R.layout.row,grocery);
listView.setAdapter(adapter);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_groceries);
listView = (ListView) findViewById(R.id.listView);
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create();
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(LacClient.ENDPOINT)
.addConverterFactory(GsonConverterFactory.create(gson));
Retrofit retrofit = builder.build();
final LacClient client = retrofit.create(LacClient.class);
Runnable runnable = new Runnable() {
@Override
public void run() {
Call<ArrayList<GroceryItem>> call=client.groceryList();
call.enqueue(new Callback<ArrayList<GroceryItem>>() {
@Override
public void onResponse(Call<ArrayList<GroceryItem>> call, Response<ArrayList<GroceryItem>> response) {
grocery = response.body();
}
@Override
public void onFailure(Call<ArrayList<GroceryItem>> call, Throwable t) {
}
});
try {
handler.sendEmptyMessage(0);
}catch (Exception e){}
}
};
Thread fetchGroceryList = new Thread(runnable);
fetchGroceryList.start();
}
}
logcat中显示以下异常。(我知道这是一个NullPointerException,我知道它是什么。我想知道的是如何解决它。而且只有当我创建一个线程时才会出现。)
04-28 17:58:24.830 3774-3774/com.letsallchef.letsallchef E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.letsallchef.letsallchef, PID: 3774
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
at android.widget.ListView.setAdapter(ListView.java:487)
at com.letsallchef.letsallchef.GroceriesActivity$1.handleMessage(GroceriesActivity.java:25)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5343)
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:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
答案 0 :(得分:2)
call.enqueue(new Callback<ArrayList<GroceryItem>>() { already create a thread, you dont need to create yourselft.remove your `runnable = new Runnable() {`
答案 1 :(得分:1)
grocery
为空。
您正在将空列表传递给数组适配器。