0

Я получаю сообщения с сервера и сохраняю их в локальной базе данных с помощью службы. Мне нужно создать новый поток для ответа на волейбол, если я этого не сделаю, поэтому пользовательский интерфейс настолько сильно отстает, но обновляется список. Теперь после создания нового потока пользовательский интерфейс больше не отстает, но не обновляет список. Ниже приведен код моего класса обслуживания.notifyDataSetChanged не работает для Thread

ChatService.java

StringRequest stringRequest=new StringRequest(Request.Method.GET, url.replaceAll(" ","%20"), new Response.Listener<String>() { 
     @Override 
     public void onResponse(final String response) { 
      networkThread=new Thread(new Runnable() { 
       @Override 
       public void run() { 
        Gson gson=new Gson(); 
        chatResponse=gson.fromJson(response,GetAllChatResponse.class); 
        for (Object obj:chatResponse.getData()) { 
         Log.d("conversation response",""+((ChatDataResponse) obj).getMessage()); 
         sqLiteDataProvider.insertMessage(true,(ChatDataResponse) obj); 
        } 
        Log.d("conver","ok"); 
        sendWaResult(); 
       } 
      }); 
      networkThread.start(); 

     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.d("convo error",""+error.getMessage()); 
     } 
    }); 
    MySingleton.getInstance(getApplicationContext()).addToRequestQueue(stringRequest); 

public void sendWaResult(){ 
    final Intent intent=new Intent(KYOWA_RESULT); 
    try{ 
     Looper.prepare(); 
    } catch (Exception e) {} 
    Handler handler = new Handler(); 
    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      waBroadcastManager.sendBroadcast(intent); 
      stopSelf(); 
     } 
    }); 
}` 

Хотя с другой стороны, в фрагменте я хочу, чтобы уведомить мой ListView, что база данных была обновлена ​​с помощью следующего кода.

ChatFragment.java

receiver=new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       ChatFragment.this.getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         getChat(); 
        } 
       }); 

      } 
     }; 
private void getChat() { 
    new AsyncTask<Void,Void,ArrayList<ChatListDataResponse>>(){ 

     @Override 
     protected ArrayList<ChatListDataResponse> doInBackground(Void... voids) { 
      return sqLiteDataProvider.getChatList(); 
     } 

     protected void onPostExecute(ArrayList<ChatListDataResponse> list) 
     { 
      listDataResponses = list; 
      if (chatListAdapter==null){ 
       chatListAdapter=new ChatListAdapter(getContext(),listDataResponses); 
       mListView.setAdapter(chatListAdapter); 
      }else { 
       chatListAdapter.updateChatList(listDataResponses); 
      } 
     } 
    }.execute(); 

И я уведомляя мой ListView нестандартного BaseAdapter.

ChatListAdapter.java

public void updateChatList(ArrayList<ChatListDataResponse> numbers){ 
    listDataResponses.clear(); 
    listDataResponses.addAll(numbers); 
    this.notifyDataSetChanged(); 
    this.notifyDataSetInvalidated(); 
} 
  • Результат я получаю: За первый раз после сохранения ответа апи в местный дБ ListView остается пустым. И при каждом вызове ChatService listview не обновляется.
  • Результат Я хочу: я хочу уведомить список, когда ChatService вызывается.
+0

Вы решили свою проблему? –

ответ

1

Попробуйте Handler обновить пользовательский интерфейс, поскольку потоки не дают подтверждения для работы на связанные с UI работы:

new Handler().post(new Runnable() { 
     public void run() { 
     //UI updation code 
     } 
}); 

или попробовать:

runOnUiThread(new Runnable() { 
     public void run() { 
     //UI updation code 
     } 
}); 
+0

Я уже использую 'runOnUiThread' для вызова getChat, который предназначен для обновления интерфейса. –

1

Я хотел бы предложить вам использовать AsyncTask<Void, Void, Void>() , переопределить doInBackground() с кодом и внутри onPostExecute() выполнить adapter.notifyDataSetChanged()

+0

метод updateChatList вызывается только из onPostExecute(). –

+0

Вы также называете 'setInvalidated()', почему? –

+0

ничего не работало, поэтому просто пытались разные вещи. –

Смежные вопросы