2017-06-01 71 views
0

我的意图是通过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; 
} 

回答

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); 


     } 
+0

这不可能是正确的。当我这样做时,我得到一个'致命例外:只有创建视图层次结构的原始线程可以触及其视图。' – Jupiter

+0

使用onResponse方法(列表 resultList)创建接口,并在您获取数据时调用此方法并将其作为说出你的结果列表,并让你的活动实现这个方法,并从参数中拿出列表并显示它! – Fakher

1

如果您有活动的实例的引用您可以创建填充适配器可运行和使用活动的runOnUiThread方法

结账的文件运行它:

https://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

+0

如何从工作线程中获取活动的实例? – Jupiter

+0

如果我理解你的代码是正确的,那么你已经在片段内创建了工作线程,如果这是你可以使用方法getAcitvity()的情况,其他方式是你可以将一个活动实例传递给线程,但确保它是一个星期参考以避免内存泄漏。 –

+0

谢谢,这就是答案! (下面更新它) – Jupiter

0

答案是内runnable()

创建 runOnUiThread并调用一个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); 


    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; 
} 
相关问题