我正在开发一个 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/