multithreading - 如何从完全不相关的类更新 ListView

标签 multithreading android-listview android

我已经阅读了很多关于如何更新 ListView 的问题。他们几乎都说 adapter.notifyDataSetChanged() (如果在带有 runOnUiThread 的单独线程中)。

我的问题开始得有点早:我什至如何获得我需要的适配器或与此相关的 Activity 来调用 runOnUiThread?

这是我当前代码的一个非常简化的版本:

我有一个数据类,可以随时随地更新。更新方法需要启动一个新线程,这就是为什么我不能简单地等待返回值。

class Data {
private static double[] data = new double[7]

public static void update(final Context context) {

    new Thread(new Runnable() {
        @Override
        public void run() {
              //do lots of complicated stuff
        }
    }).start();
}

public double[] getData {
    return data;
}

我有一个 Activity(不是主 Activity),其中包含 ListView

public class ListViewActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ListView);
    ListView listView = (ListView) findViewById(R.id.MyListView);
    listView.setAdapter(new CustomListViewAdapter(this));
}

然后我使用自定义适配器按照我的需要设置 ListView。

class CustomListViewAdapter extends BaseAdapter {

private final LayoutInflater layoutInflater;

public CustomListViewAdapter(Context context) {
    layoutInflater = LayoutInflater.from(context);
}

@Override
public View getView(int position, View view, ViewGroup parent) {
    ViewHolder viewHolder = new ViewHolder();
    if (view == null) {
        view = layoutInflater.inflate(R.layout.listView_row_layout, parent, false);
        viewHolder.value = (TextView) view.findViewById(R.id.listViewDataTextField);
        view.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) view.getTag();
    }
    double data = Data.getData()[position];
    viewHolder.value.setText(data+"");

    return view;
}
private class ViewHolder {
    TextView value;
}

现在我想在 update() 方法中的线程完成获取新数据后立即更新 ListView。获取数据可能需要几秒钟,因此无法预测届时哪些 Activity 将处于 Activity 状态。如果我的 ListViewActivity 处于 Activity 状态,我希望 ListView 立即更改为新数据。

那么如何在另一个线程中从另一个不是 Activity 的类更新 ListView?我不认为将适配器放在静态字段中是个好主意,因为 ListViewActivity 可能一直在创建和销毁?但是我还有哪些其他选择?

最佳答案

定义一个回调接口(interface)。让您的更新方法将此回调的实例作为参数,并在更新完成时回调它。

public interface UpdateCallback {
    public void onUpdateFinished();
}

public void update(final Context context, final UpdateCallback callback) {

    new Thread(new Runnable() {
        @Override 
        public void run() { 
            // do lots of complicated stuff
            callback.onUpdateFinished();
        } 
    }).start();
}

然后在您的 Activity 中您可以通知适配器数据已更改:

Data.update(this, new UpdateCallback() {
    public void onUpdateFinished() {
        adapter.notifyDatasetChanged();
    }
});

关于multithreading - 如何从完全不相关的类更新 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23879314/

相关文章:

java - 部分方法的Spring和同步

android - 外部数据库和 Android 应用程序

java - Android 找不到 View

java - 如何减小 Android 上通过共享 Intent 收到的图片的大小?

java - 新的SingleThreadscheduledExecutor

c++ - C++中线程的使用

c# - 在 C# .NET 中管理多线程,控制每个操作的线程数

Android 保留 listview 之前的滚动位置

android - 长按时突出显示自定义 ListView 项

android - 创建像 Instagram 或 FB 这样的墙