如何从片段中的后台线程更新 UI

1 java multithreading android fragment android-fragments

我有一个带有 ListView 的 Fragment 的应用程序。我 ping 网络上的 IP 地址,当我收到响应时,我将 IP 地址添加到列表中。完成对 IP 地址的 ping 操作后,我将回复我的 ping 的 IP 地址列表放入 ListView。

我想要做的是在我 ping 的时候更新这个 ListView,而不是在我 ping 所有的 IP 地址之后更新。为了 ping IP 地址,我使用了一个 AsyncTask,然后调用一个 Runnable 线程。当我找到 IP 地址时,如何告诉 Fragment 从该 Runnable 类更新 UI?

我的课程的粗略布局如下。

public class FinderFragment extends ListFragment {

    private void CallFind(){
        new Find().execute();
    }

    private class Find extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {
            SearchNetwork searchNetwork = new SearchNetwork(ipAddress);
            try {
                searchNetwork.StartFind();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            UpdateDeviceList();
        }
    }
}

public class SearchNetwork {

    public void StartFind() throws InterruptedException {
        Thread t[] = new Thread[20];
        for(int i=0; i<02; i++){
            t[i] = new Thread(new FindDevices(i*5));
            t[i].start();
        }
        for(Thread thread : t){
            thread.join();
        }
    }

    class FindDevices implements Runnable{

        @Override
        public void run() {
            //Ping the IP addresses here
            //I want to update UI from here
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 5

尝试这个....

getActivity().runOnUiThread(new Runnable(){
            @Override
            public void run(){
               // Do whatever you want
               }
             });
Run Code Online (Sandbox Code Playgroud)