我的目的是通过okhttp接口获取从服务器获取的数据。 okhttp方法在异步中运行,因此在与活动不同的线程上运行。有问题的活动是一个创建listView的片段。我试图通过ArrayAdapter用okhttp中的数据填充listView。
如何将数据从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;
}
答案 0 :(得分:1)
如果你有对活动实例的引用,你可以创建一个runnable来填充适配器并使用活动的runOnUiThread
方法运行它
签出文档:
https://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)
答案 1 :(得分:0)
您必须启动适配器并在onResponse CallBack中列出。如果没有响应,只显示错误对话框,否则,使用结果启动适配器。代码必须如下所示:
@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);
}
//Put your code for showing the list item here.
ArrayAdapter<String> listViewAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, nfl);
listview.setAdapter(listViewAdapter);
}
答案 2 :(得分:0)
答案是创建runOnUiThread
并在runnable()
这是正确的代码:
@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);
OkHttpClient client = new OkHttpClient();
String url = "http://192.168.8.101:7777/friendlist/" + USERNAME;
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();
response.close();
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);
}
System.out.println(nfl);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
ArrayAdapter<String> listViewAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, nfl);
listview.setAdapter(listViewAdapter);
}
});
}
});
return view;
}