java - 安卓 : Thread not passing data to Handler

标签 java android multithreading

我正在开发一个 Android 项目,在该项目中我必须连接到服务器、检索餐馆列表并将其显示在 ListView 中。情况是当应用程序启动时,为了测试,我正在启动另一个 Intent 并在其中运行一个线程。在线程内,我正在从服务器检索数据,我希望将其显示在 ListView 上。但是应该获取数据并显示它的处理程序方法不起作用。 不幸的是,我没有遇到任何错误来隔离和处理问题,并且由于在线程之间传递数据是一个核心功能,因此我迷失在它之间调用的众多方法中。请看看我做错了什么。

MainActivity 类:

public class MyActivity extends Activity {

    RestaurantServiceImpl restaurantService = new RestaurantServiceImpl();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button = (Button) findViewById(R.id.standortermitteln);
//Below starts the new view
        Intent listScreen = new Intent(getApplicationContext(),RestaurantList.class); 
}

RestaurantList.java:

  public class RestaurantList extends Activity {

        String url1 = "http://192.168.178.40:8080/restaurant/listing";

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.restos);

            ListView listView = (ListView) findViewById(R.id.restaurantList);
            Thread thread = new Thread(new Runnable() {

                @Override
                public void run() {
                    Log.d("Are we in listRestaurants","Checking");
                    try {
                        RestTemplate restTemplate = new RestTemplate();
                        HttpHeaders requestHeaders = new HttpHeaders();
                        requestHeaders.setAccept(Collections.singletonList(new MediaType("application", "json")));
                        HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
                        restTemplate.getMessageConverters().add(new GsonHttpMessageConverter());
                        ResponseEntity<Restaurant[]> responseEntity = restTemplate.exchange(url1, HttpMethod.GET, requestEntity, Restaurant[].class);
                        Restaurant[] restaurantList = responseEntity.getBody();
                    for(Restaurant restaurant : restaurantList){
// I am able to print these messages,
                            Log.d(restaurant.getRestaurantName(), "Restaurant name");
                        }
                    } catch (Exception e) {
                        Log.d("We are in stacktrace",e.toString());
                        e.printStackTrace();
                    }
                }
            });
            thread.setPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
            thread.start();

// I am not reaching here to set the ListView
             Handler messageHandler = new Handler(){
                public void handleMessage(Message message){
                    try {
                        Restaurant[] restaurants = (Restaurant[]) message.obj;
                        for(Restaurant restaurant : restaurants){
                            Log.d(restaurant.getRestaurantName(), "Restaurant name");
                        }
                        if(restaurants.length<1){
                            Log.d("Restaurants from thread are empty"," check");
                        }
                        for(Restaurant restaurant : restaurants){
                            Log.d(restaurant.getRestaurantName(), "Restaurant name in messageHandler");
                        }
                        ArrayAdapter<Restaurant> adapter = new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_list_item_1,restaurants);
                        listView.setAdapter(adapter);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            };
        }
    }

最佳答案

queueNewRestaurants(restaurantList); 添加到第一个线程的末尾。

private static final int NEW_RESTAURANTS = 1;

public void queueNewRestaurants(Restaurant[] restaurants) {
    android.os.Message message = messageHandler.obtainMessage(
            NEW_RESTAURANTS,
            restaurants
    );
    message.sendToTarget();
}

关于java - 安卓 : Thread not passing data to Handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721042/

相关文章:

android - 是否可以在将 fragment 添加到 Activity 后将参数传递给 fragment ?

c++ - 是否可以鼓励线程排队而不强制它?

java - Google Cloud Endpoints SPI 受限

java - android studio 中出现错误 : java. lang.ClassNotFoundException

java - 在数值数组和 SimpleITK Image 对象之间传输

android - 滚动不适用于 CoordinatorLayout + 视差图像 + BottomSheetLayout

java - 一次刷新多个 Realm 实例?

windows - QueryPerformanceCounter 和线程安全

java - SWT 进度条

java - 接收Java : Sleep before OnNext (Sleep before emitting from Observable)