如何在以下代码上实现线程?

时间:2017-04-28 09:48:08

标签: java android multithreading android-studio retrofit2

我是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)

2 个答案:

答案 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为空。

您正在将空列表传递给数组适配器。

相关问题