別のスレッドでネットワークからデータを受信しています(これは他のクラスにありますが、ここで問題全体が発生しますが、レガシーコードの固有の複雑さのために受信コードをアクティビティクラスに入れることはできません)更新したいデータが受信されたときのListView(リアルタイム)..そのために、ListView、ArratAdapter、およびArrayList変数を作成しました...以下は関連するコードです
public class LogInSuccessActivity extends Activity {
private String LOG_TAG = "LogInSuccessActivity";
private TextView welcomeTxtLbl = null;
private ListView buddyListView = null;
private ArrayAdapter<Buddy> buddyListAdapter = null;
// BuddyList
private ArrayList<Buddy> buddyList = null;
/*
* (non-Javadoc)
*
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.loginsuccess);
// get the TextView and ListView
welcomeTxtLbl = (TextView) findViewById(R.id.loginsuceeslbl);
buddyListView = (ListView) findViewById(R.id.buddylistview);
String uname = getIntent().getStringExtra("username");
if (uname != null) {
welcomeTxtLbl.setText("Welcome " + uname + ", Greetings!!");
} else {
welcomeTxtLbl.setText("SignIn successfull !!");
}
buddyList = new ArrayList<Buddy>();
buddyListAdapter = new ArrayAdapter<Buddy>(this,
android.R.layout.simple_list_item_1, buddyList);
buddyListView.setAdapter(buddyListAdapter);
// persist the context
ReceiverThread.loginSuccessActi = LogInSuccessActivity.this;
}
/*
* (non-Javadoc)
*
* @see android.app.Activity#onResume()
*
* @Override protected void onStart() { // TODO Auto-generated method stub
* super.onStart();
*
* }
*/
@Override
protected void onStop() {
super.onStop();
Log.e(LOG_TAG, "onStop is called ");
buddyListAdapter.clear();
buddyList.clear();
}
public void addBuddy(Buddy buddy) {
buddyList.add(buddy);
buddyListAdapter.notifyDataSetChanged();
}
Runnable updateTheListView = new Runnable() {
@Override
public void run() {
// synchronized (buddyList) {
buddyListAdapter.notifyDataSetChanged();
// }
}
};
public void refreshTheListView(Buddy buddy) {
System.out.println("Refreshing the ListView list size is : "
+ buddyList.size());
buddyList.add(buddy);
// buddyListAdapter.add(buddy);
// buddyListView.post(updateTheListView);
this.runOnUiThread(updateTheListView);
}
/*
* (non-Javadoc)
*
* @see android.app.Activity#onDestroy()
*/
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
Log.e(LOG_TAG, "onDestroy is called ");
super.onDestroy();
buddyList = null;
buddyListAdapter = null;
buddyListView = null;
ReceiverThread.loginSuccessActi = null;
}
}
スレッドから、新しいバディが受信されるたびにメソッドを呼び出しますaddBuddy()
...レシーバースレッドが別のクラスにあるため、これは静的メソッドです...
ただし、コードは機能していません。このコードを改善するための提案をお願いします。私はそれが良くないことを知っていますが、Androidプログラミングの知識が不足しているため、修正方法がわかりません. また、私の場合に使用できるかどうかについてもどこかで読みDataSetObserver
ました..私はAndroidアリーナの初心者なので、基本的な概念が不足していることを許してください....ありがとう、
編集 私が言及するのを忘れていた 1 つのことは、私は別のスレッドから UI を更新していないことです (私はできないことを知っています)。 addBuddy() を呼び出します...
UI スレッドnotifyDataSetChanged()
で、ArrayAdapter のメソッドを呼び出して、ビューの更新を実行します。
EDIT 2 以下は、データを受信する別のスレッドのコードです..
if (loginSuccessActi != null) {
loginSuccessActi.refreshTheListView(new Buddy(values));
// loginSuccessActi.addBuddy(new Buddy(values));
}
次のエラーが表示 されますアダプターのコンテンツが変更されましたが、ListView は通知を受け取りませんでした。