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