android - 无法解析方法 .runOnUiThread

标签 android listview

我找到了 this这里有一个关于如何使用 runOnUiThread 方法的示例,但我不明白如何使用它。

我在主要 Activity 中设置了列表适配器

    // Set a gobal reference to the list adapter and the list respectivly 

    ListAdapter listAdapter;
    static ArrayList<String> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // some code

        adapter = new ListAdapter(getActivity(), R.layout.item_layout, list);
        listView.setAdapter(adapter);

        // some code

    }

我这里有列表适配器调用服务处理程序类

public class ListAdapter {

    // some code

    ServiceHandler sh = new ServiceHandler();

    sh.run();
}

这是 ServiceHandler 类中的 .run() 方法,我在其中更新了列表和列表适配器

public void run(Adapter listAdapter, ArrayList<String> list){

    // some code

    list[0] = "foo";
    listAdapter.notifyDataSetChanged;
}

但是我在运行时遇到了这个错误

Only the original thread that created a view hierarchy can touch its views.

所以我尝试用.runOnUiThread解决错误

所以这里又是 ServiceHandler 类中的 .run() 方法,使用 runOnUiThread

public void run(Adapter listAdapter, ArrayList<String> list){

    // some code

    runOnUiThread(new Runnable() {
        @Override
        public void run() {

            list[0] = "foo";
            listAdapter.notifyDataSetChanged;
    });
}

但是我明白了

Cannot resolve method 'runOnUiThread(anonymous Java.lang.runnable)'

最佳答案

您可以将服务处理程序作为 private 成员类移动到您的 Activity 中,如下所示,以使用 Activity 的 this 上下文。

class MyActivity extends Activity {

    private class ServiceHandler /** Whichever class you extend */ {
        public void run() {
            MyActivity.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    mAdapter.notifyDataSetChanged();
                }

            });
        }
    }

    private MyListAdapterTracks mAdapter;

    private ServiceHandler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Some code

        mAdapter = new MyListAdapterTracks(getActivity(), R.layout.item_layout, list);
        listView.setAdapter(mAdapter);

        // Some code

        ServiceHandler sh = new ServiceHandler();
        sh.run();
    }
}

编辑:

public class ServiceHandler /** Whichever class you extend */ {

    private final Activity mActivity;

    private final MyListAdapterTracks mAdapter;

    public ServiceHandler(Activity activity, MyListAdapterTracks adapter) {
        mActivity = activity;
        mAdapter = adapter;
    }

    @Override
    public void run() {
        mActivity.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                mAdapter.notifyDataSetChanged();
            }

        });
    }

    // More code

}

然后像这样在您的 Activity 中实例化它:

class MyActivity extends Activity {

    private MyListAdapterTracks mAdapter;

    private ServiceHandler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Some code

        ServiceHandler sh = new ServiceHandler(this);
        sh.run();
    }
}

关于android - 无法解析方法 .runOnUiThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33979132/

相关文章:

android - 为什么在 ListView 中使用 Inflater

android - 我有两个 Activity 。我想将数据从第二个 Activity 发送到前一个 Activity 。第一个 Activity 有自定义 ListView

android - 以编程方式翻译 View Pre-Honeycomb

java - FirebaseDatabase.getInstance().getReference() 到子节点并列出该子节点下的键值对

android - 运行 Google map API V2 示例时出错

Android Studio - 按钮大小

android - 如何在 Android 上立即启动闹钟

listview - UWP 更改 ListView 项目高度

C# ListView 项目图像

wpf - 如何在WPF ListView中获取光标下的项目