如何让奴隶通知主人?

时间:2017-03-06 22:32:32

标签: android multithreading mutex

我想通知UI线程有关来自从属线程的更改事件,以便UI线程可以更新视图。对于一次执行,事情进展顺利,例如:

public Class MainActivity extends Activity{

private final Object mutex = new Object();
private String[] data;
private boolean flag = false;


            //UI Thread
            synchronized(mutex)
            {
                try {
                    mutex.wait();                       
                    if(!flag){
                        adapter = new PlayListAdapter(this, R.layout.activity_row_item, data);              
                        listView = (ListView)findViewById(R.id.playlist_listView);        
                        listView.setAdapter(adapter);
                        flag=true;
                    } else {
                        adapter.clear();
                        adapter.addAll(data);
                        adapter.notifyDataSetChanged();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }       

            //Slave thread
            While(true){
                 //Waiting for an event to occur in order to update data
                 //change data
                 synchronized(mutex){
                         mutex.notify();
                 } 
            }
   } 

但是当我尝试无限制地进行UI线程循环并等待奴隶的通知时,该程序无效:

//UI Thread
    while(true){
            synchronized(mutex)
            {
                try {
                    mutex.wait();                       
                    if(!flag){
                        adapter = new PlayListAdapter(this, R.layout.activity_row_item, data);              
                        listView = (ListView)findViewById(R.id.playlist_listView);        
                        listView.setAdapter(adapter);
                        flag=true;
                    } else {
                        adapter.clear();
                        adapter.addAll(data);
                        adapter.notifyDataSetChanged();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }   
   }      

我首先尝试从奴隶线程更改视图并发现这在Android中被禁止,所以我尝试使用处理程序线程,但事情并没有像我预期的那样顺利。

1 个答案:

答案 0 :(得分:0)

我没有看到使用线程执行此操作的简单方法,您可以尝试使用IntentServices和第三方库(如EventBus)在完成后与您的活动进行通信。

检查http://greenrobot.org/eventbus/documentation/how-to-get-started/

如果您真的想在主UI中执行此操作,则可以使用AsyncTask。 检查此表以使用Android https://i.stack.imgur.com/N1DNU.png

中的并发性