2012-05-09 64 views
2

我在一個單獨的線程(這是在一些其他類,這裏是整個問題是從網絡接收數據,但我不能把接收代碼放在活動類由於固有的複雜性遺留代碼 ),我想作爲接收到數據(實時)更新的ListView。對於我已經創建了一個ListView,ArratAdapter和一個ArrayList variavles ...以下是一些相關的代碼如何從一個單獨的類更改DayView的ListView?

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; 
    } 

} 

現在從線程我會在每次收到新的Buddy時調用方法addBuddy() ...由於Receiver線程處於不同的類中,這是一種靜態方法...

該代碼無法正常工作,請給我一些建議以改進此代碼。我知道它不好,但由於缺乏對類似動作的知識,我不知道如何解決這個問題。我也讀到過有關DataSetObserver可他們我的情況下使用..我在機器人競技場新手,所以請原諒我缺乏的基本概念....謝謝,

編輯 有一件事我忘了要提到的是,我不是從一個單獨的線程更新UI(我知道我不能),我所做的是每當Somedata(爲簡化問題當然我做所有過濾)到達時,我稱之爲addBuddy() ...

現在在UI線程上,我會調用ArrayAdapter的notifyDataSetChanged()方法來進行視圖更新。

EDIT 2 以下是從哪裏接收數據另一個線程的代碼..

if (loginSuccessActi != null) { 
         loginSuccessActi.refreshTheListView(new Buddy(values)); 
//      loginSuccessActi.addBuddy(new Buddy(values)); 
        } 

,我得到以下錯誤 適配器的內容發生了變化,但ListView控件沒有收到通知。

+0

我想你需要展示更多的代碼才能得到更具體的問題診斷。你能否至少顯示接受新數據並調用addBuddy的代碼? – Louth

+0

請參閱編輯,我已更改代碼.... – aProgrammer

回答

1

您應該閱讀android開發人員網站上的Processes and Threads

即使您正在單獨的線程上工作,也無法從另一個進程訪問UI線程。

解決此問題的一種方法是實施AsyncTask來完成該工作,然後通過onPostExecute方法更新您的適配器。

+0

請參閱編輯... – aProgrammer

0

上SO讀取幾乎所有的類似的問題後,我終於解決了這個問題,通過使用以下步驟: -

  1. 固定在其中調用addBuddy()方法的線程的一些設計問題,
  2. 改變了我的addBuddy方法

    公共無效addBuddy(最終的好友的好友){

    Log.i(LOG_TAG, " ADDING BUDDY + " + buddy); 
        buddyListView.post(// UI thread ; 
          new Runnable() { 
           @Override 
           public void run() { 
            // TODO Auto-generated method stub 
            synchronized (buddyList) { 
             buddyList.add(buddy); 
             buddyListAdapter.notifyDataSetChanged(); 
            } 
            // buddyListAdapter.add(buddy); 
           } 
          }); 
    } 
    

我也改變了應用程序的OverAll設計,因爲我在搜索這個問題的答案時比較聰明。現在我使用Singelton Class和Static變量共享數據。如果其他人將來有類似的問題,以下鏈接可能會有用。

Painless Threading

Singleton Class

Using Threads

對於那些,誰也有類似的問題,最好的建議就是「相信自己,你可以做到這一點。」

相關問題