我的意图是通过okhttp接口取回从服务器获取的数据。 okhttp方法在异步中运行,因此在与活动分开的线程中运行。有问题的活动是创建listView的片段。我试图通过ArrayAdapter与okhttp的数据填充listView。如何将数据从okhttp异步线程回发到主线程中的ArrayAdapter?
如何将数据从okhttp异步线程回发到ArrayAdapter?
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_friends, container, false);
final ListView listview = (ListView) view.findViewById(R.id.friendListView);
ArrayAdapter<String> listViewAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, nfl);
listview.setAdapter(listViewAdapter);
OkHttpClient client = new OkHttpClient();
String url = "http://192.168.8.101:7777/friendlist";
Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
String RD = response.body().string();
String trimmedList = RD.substring(1, RD.length()-1);
String[] fl = trimmedList.split(",");
final List<String> nfl = new ArrayList<String>();
for (String element : fl){
String ee = element.replaceAll("^\"|\"$", "");
nfl.add(ee);
}
}
});
return view;
}
这不可能是正确的。当我这样做时,我得到一个'致命例外:只有创建视图层次结构的原始线程可以触及其视图。' – Jupiter
使用onResponse方法(列表 resultList)创建接口,并在您获取数据时调用此方法并将其作为说出你的结果列表,并让你的活动实现这个方法,并从参数中拿出列表并显示它! –
Fakher