0

サーバーからメッセージを取得し、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に通知します。
+0

あなたは問題を解決しましたか? –

答えて

1

スレッドはUI関連の仕事に取り組む確認を与えていないので、UIを更新するハンドラを試してみてください:

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

か試してみてください。

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

私はすでに 'runOnUiThread'を使ってUIを更新するgetChatを呼び出しています。 –

1

私はAsyncTask<Void, Void, Void>()を使用するためにあなたをお勧めします、doInBackground()をコードで上書きし、onPostExecute()を実行します。 adapter.notifyDataSetChanged()

+0

updateChatListメソッドは、onPostExecute()からのみ呼び出されます。 –

+0

あなたは 'setInvalidated()'も呼びます、なぜですか? –

+0

何も動いていないので、違うことを試しています。 –

関連する問題