サーバーからメッセージを取得し、Serviceを使用してローカルデータベースに格納しています。もし私がUIがそれほど遅れているのではなく、リストビューが更新されていれば、私は新しいスレッドfor volleyのレスポンスを作成する必要があります。今度は新しいスレッドを作成した後、UIはもはや遅れていませんが、リストビューは更新されません。以下は私のサービスクラスコードです。notifyDataSetChangedがスレッド用に機能していません
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();
}
});
}`
フラグメント内の他の一方で、私は、データベースのコードに従うことによって更新されたことを私のリストビューを通知したいものの。
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();
そして私は、カスタムBaseAdapterによって私のリストビューを通知しています。
ChatListAdapter.java
public void updateChatList(ArrayList<ChatListDataResponse> numbers){
listDataResponses.clear();
listDataResponses.addAll(numbers);
this.notifyDataSetChanged();
this.notifyDataSetInvalidated();
}
- 結果、私は取得しています:非常に最初の時間のためにリストビューは空白のままdbのローカルへのAPIレスポンスを保存した後。 ChatServiceを呼び出すたびに、リストビューは更新されません。
- 結果:ChatServiceが呼び出されるたびにlistviewに通知します。
あなたは問題を解決しましたか? –