当前位置: 代码迷 >> Android >> 怎么在异步调用WebAPI后用获得的数据来显示Activity和Fragment
  详细解决方案

怎么在异步调用WebAPI后用获得的数据来显示Activity和Fragment

热度:98   发布时间:2016-04-28 04:33:36.0
如何在异步调用WebAPI后用获得的数据来显示Activity和Fragment
RT,如何在异步调用WebAPI后用获得的数据来显示Activity和Fragment。

基本构成是1个Activity,1个Flagment,1个画面。
想实现的功能是先调用WebApi,再将取得的数据显示在画面中,同时还要生成图表。

现在通过AsyncTaskLoader调用WebAPI。已经取得了数据并返回到了MainActivity的onLoadFinished()方法中。

现在的问题是,启动后Activity和Flagment在没有数据的情况下就生成了画面。之后Activity的onLoadFinished()方法才收到WepAPI的返回数据。请问怎么让Activity和Flagment在等待WebAPI的数据返回后才生成画面?或者在WebAPI的数据返回后重新生成画面?

代码如下:
MainActivity
{
    //其他部分省略
    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main_activity);

Bundle webApiParam = new Bundle();
                webApiParam.putString("user", "user");
                webApiParam.putString("password", "password");
               getSupportLoaderManager().initLoader(0, webApiParam, this); 

       onNewIntent(getIntent());
}

public Loader<ArrayList<String>> onCreateLoader(int id, Bundle args) {
Log.d(TAG, "onCreateLoader(id="+id+", args="+args+")");

String url = "https://url";
mAppLoader = new DataAsyncLoader(this, url);
DataAsyncLoader loader = new DataAsyncLoader(this, url);
return loader;
}

@SuppressWarnings("unchecked")
public void onLoadFinished(Loader<ArrayList<String>> loader, ArrayList<String> listValue) {
Log.v(TAG, "onLoadFinished(loader="+loader+", listValue="+listValue+");

if (listValue != null){
mListValue = listValue;
}else{
Log.v(TAG, "NO Data");
}
}

@Override
public void onLoaderReset(Loader<ArrayList<String>> arg0) {
Log.v(TAG, "onLoaderReset");
}
}
------解决方案--------------------
为什么不把webApi的调用,移到本Activity在被startActivity()启动之前呢?
------解决方案--------------------
你这里去网络上获取数据和mainActivity显示是异步的,谁也不等谁,可以吧显示mainActity放在数据获取成功的方法里。
------解决方案--------------------
你可以把你的这个loader写到一个单独的类中,在那里面当完全执行之后,数据也获取了,在启动activity,将数据传递给activity或者fragment
------解决方案--------------------
用广播就可以,你在Activity里面注册一个广播,然后异步处理数据成功后 发送广播然后更新UI。
第一次进来的时候可以显示加载进度的UI,等数据处理完了 再显示有数据的UI,

还有一种方法是 在Activity里面 new 一个 Handler 把这个Handler 引用传给 异步数据处理Loader,处理完了 直接发送Message,也可以更新UI 。
------解决方案--------------------
数据没回来的时候做个等待 等数据回来了做异步显示应该不难吧
  相关解决方案