2016-02-27 2 views
0

Я сделал простой клиентский сервер для android. У меня проблема при отправке объекта с сервера клиенту. Объект получен в порядке, и когда я проверяю журнал, он показывает мне, что объект был отправлен успешно.Клиентский сервер Android не будет показывать объект

Проблема возникает, когда я пытаюсь получить этот объект и поместить его в свой адаптер ListView. Адаптер работает, я проверил его со случайным ArrayList, который я создал. Моя проблема в том, когда я пытаюсь поместить значения AsyncTask в свой адаптер.

public class RestaurantListFragment extends Fragment { 

    private ArrayList<Resturant> res = new ArrayList<>(); 
    private ListAdapter adapter; 
    private Firebase restRef = new Firebase("https://restmeup.firebaseio.com/restaurants"); 
    private Client mClient; 
    // private connectTask t = (connectTask)new connectTask().execute(); 


    public RestaurantListFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     new connectTask().execute();  

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    //  new connectTask(getView()).execute(); 
     final View rootView = inflater.inflate(R.layout.fragment_two, container, false);  

     ListView restaurantList = (ListView) rootView.findViewById(R.id.list); 

     adapter = new ListAdapter(getContext(), res, getActivity()); 
     restaurantList.setAdapter(adapter); 

     // connectTask t = (connectTask)new connectTask().execute(); 
     if (mClient != null) { 
      mClient.sendMessage("bar"); 
     } 
     SqlQueriesConverter sql = new SqlQueriesConverter(); 
     sql.getResurantsListQuery("bar"); 
     //  sql.getUserFavoritesResturants(accessToken.getUserId()); 
     mClient.sendMessage(sql.getQuery()); 
     // t.setArray(res); 


     mClient.sendMessage("/quit"); 
     mClient.stopClient(); 

     final EditText searchText = (EditText)rootView.findViewById(R.id.searchListView); 

     searchText.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       System.out.println("Before---------"); 
      } 
      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       String text = searchText.getText().toString().toLowerCase(Locale.getDefault()); 
       adapter.filter(text); 
       adapter.notifyDataSetChanged(); 
       System.out.println("array: " + res.toString()); 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       System.out.println("After---------"); 
      } 
     }); 

     // Inflate the layout for this fragment 
     return rootView; 
    } 


    public class connectTask extends AsyncTask<ArrayList<?>,ArrayList<?>,Client> { 
    // private Client mClient; 
     private ArrayList<?> arrayList = new ArrayList<>(); 

     @Override 
     protected Client doInBackground(ArrayList<?>... message) { 

      //we create a Client object and 
      mClient = new Client(new Client.OnMessageReceived() { 
       @Override 
       //here the messageReceived method is implemented 
       public void messageReceived(ArrayList<?> message) { 
        //this method calls the onProgressUpdate 
        // publishProgress(message); 
        onProgressUpdate(message); 
       } 
      }); 

      mClient.run(); 
      return null; 
     } 

     // @Override 
     protected void onProgressUpdate(ArrayList<?>... values) { 
       super.onProgressUpdate(values); 

      ArrayList<?> arr2; 
      if (values[0].get(0) instanceof Resturant){ 
       Log.d("step 1", "1"); 
       if (((ArrayList<?>)values[0]).get(0)instanceof Resturant) { 

        // arr2 = (ArrayList<Resturant>) values[0]; 
        res = (ArrayList<Resturant>) values[0]; 
        adapter.notifyDataSetChanged(); 
        Log.d("array",res.toString());  

       } 
      } 
      if (values[0].get(0)instanceof Review){ 
       arr2 = (ArrayList<Review>) values[0]; 
      } 
      if (values[0].get(0)instanceof UserFavorites){ 
       arr2 = (ArrayList<Review>) values[0]; 
       Log.d("step 2", "2"); 
      }  
     }  
    }  
} 
+0

Что не работает? Вы получили сообщение об ошибке? –

ответ

0

Есть две вещи, которые нужно изменить, чтобы использовать AsyncTask, как вы намерены. Первое изменение, которое вам нужно, это вернуть ArrayList, который вы получаете от вашего mClient в методе doInBackground. Это немного хлопотно, потому что похоже, что Client уже работает асинхронно, так как вы передаете обратный вызов для получения результата (это анонимный класс, который у вас есть). Второе изменение будет заключаться в реализации onPostExecute на вашем AsyncTask, так как там отправляются результаты от doInBackground. Вы добавили бы результат, посланный от doInBackground к вашему адаптеру.

В любом случае, поскольку он выглядит так, как Client уже выполняет работу асинхронно, вам не нужно использовать AsyncTask. Просто выполните логику, чтобы добавить результаты к вашему адаптеру в обратном вызове Client.OnMessageReceived.

Просто получите код, который у вас уже есть, в onProgressUpdate и выбросите его внутрь messageReceived. Что-то вроде этого:

mClient = new Client(new Client.OnMessageReceived() { 
    @Override 
    //here the messageReceived method is implemented 
    public void messageReceived(ArrayList<?> values) { 
     if (values[0].get(0) instanceof Resturant){ 
      Log.d("step 1", "1"); 
      if (((ArrayList<?>)values[0]).get(0)instanceof Resturant) { 
       res = (ArrayList<Resturant>) values[0]; 
       adapter.notifyDataSetChanged(); 
       Log.d("array",res.toString());  
      } 
     } 
    } 
}); 
+0

Он все еще не работает. может быть, у меня проблема с классом клиента? –

+0

Я не знаю, как выглядит класс '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', ' Я бы порекомендовал вам взглянуть на документацию Firebase о том, как извлекать данные, поскольку это было бы самым прямым способом: https://www.firebase.com/docs/android/guide/retrieving-data.html – ebarrenechea