Android再次使用Listerner获取仅原始线程创建错误

时间:2019-03-12 07:26:28

标签: android

在我的应用程序的简单部分中,我连接到互联网以从服务器获取数据,用于管理原始线程,我使用简单的界面作为侦听器,以从服务器获取数据到主线程后将数据发送出去,但是我再次遇到此错误:

 var _res = d.data.split(/[,|]+/);

我的听众:

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

我的主题

public void getProductData(OnGettingProducts listener) {
    onGettingProducts = listener;
}

public interface OnGettingProducts {
    void onProducts(String data);
}

在主线程上监听new Thread() { @Override public void run() { String parseUrl = "....."; String data = getJSON(parseUrl); if (onGettingProducts != null) { onGettingProducts.onProducts(data); } } }.start(); 片段:

All_Products

@Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) { ... getProductData(new OnGettingProducts() { @Override public void onProducts(String data) { Gson converter = new Gson(); Type type = new TypeToken<List<ProductDetails>>() { }.getType(); List<ProductDetails> list = converter.fromJson(data, type); addProducts(list); } }); return mView; } 方法来更新适配器:

addProducts

Logcat:

private void addProducts(List<ProductDetails> products) {
    if (products.size() > 0) {
        productsList.addAll(products);

        for (int i = 0; i < products.size(); i++) {
            if (products.get(i).getStatus() != null && !"publish".equalsIgnoreCase(products.get(i).getStatus())) {
                for (int j = 0; j < productsList.size(); j++) {
                    if (products.get(i).getId() == productsList.get(j).getId()) {
                        productsList.remove(j);
                    }
                }
            }
        }
    }

    productAdapter.notifyDataSetChanged();
}

1 个答案:

答案 0 :(得分:1)

您的onGettingProducts.onProducts(data);从非UI线程中被调用,因此应用程序显示此异常。您需要从UI线程调用它,以便它可以与UI中的视图进行交互。

您可以使用runOnUiThread()在UI线程上运行侦听器。

try {
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        onGettingProducts.onProducts(data);
    }
});
} catch (InterruptedException e) {
    e.printStackTrace();
}