2

我是在这里提问的新手,所以任何关于此的建议都将不胜感激......但我的问题是:

我正在尝试从一项活动切换到另一项活动,我将在其中显示来自服务器的一些数据。我正在通过 AsyncTask 从服务器中提取数据,但是当下载时间较长时,活动之间会显示黑屏。我已经尝试将 AsyncTask 从 onCreate() 放到 onStart() 但那里没有变化。

新活动:

public class SalesMenu extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.sales_menu);        
    setProgressBarIndeterminateVisibility(true);
    super.onCreate(savedInstanceState);
}

@Override
protected void onStart() {
    List<HashMap<String, Object>> result = null;
    AsyncTask<Void, Boolean, List<HashMap<String, Object>>> aTask = new AsyncSearchRead(
            "sale.order", 
            new Object[0], 
            new String[] {"name"}, 
            this).execute();

    try {
        result = aTask.get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    Log.d("test", (result!=null ? result.toString() : "nothing"));
    super.onStart();
}

}

我的异步任务:

public class AsyncSearchRead extends AsyncTask<Void, Boolean, List<HashMap<String, Object>>> {
String mModel; 
boolean mCount; 
Integer mOffset;
Integer mLimit; 
String mOrder; 
boolean mReverseOrder; 
Object[] mConditions;
String[] mFields;
Activity parentActivity;

public AsyncSearchRead(String model, boolean count, Integer offset, Integer limit, 
                    String order, boolean reverseOrder, Object[] conditions, String[] fields,
                    Activity activity) {
    mModel = model;
    mCount = count;
    mOffset = offset;
    mLimit = limit;
    mOrder = order;
    mReverseOrder = reverseOrder;
    mConditions = conditions;
    mFields = fields;
    parentActivity = activity;
}

@Override
protected List<HashMap<String, Object>> doInBackground(Void... params) {
    Long[] ids;
    List<HashMap<String, Object>> results;
            //Downloading the data
    ids = SetServer.connection.search(mModel, mCount, mOffset, mLimit, mOrder, mReverseOrder, mConditions);
    results = SetServer.connection.read(mModel, ids, mFields);

    return results;
}

@Override
protected void onPostExecute(List<HashMap<String, Object>> result) {
    parentActivity.setProgressBarIndeterminateVisibility(false);
}

}

当我没有关闭 onPostExecute 的可见性时,它在显示活动后继续旋转,但仅在加载后显示。

我怎样才能让它显示活动,然后才开始加载数据并显示一些进度条/加载器?

谢谢你的帮助。

4

4 回答 4

9

这是因为你正在使用.get(). .get()本质上是AsyncTask同步的(让主线程等到它完成),所以它基本上就像根本不运行AsyncTask

我的建议如下:

  1. 移动List<HashMap<String, Object>> result = null;成为成员变量。
  2. 删除整个try/catch语句(其中.get()的那个),以及对Log.*.
  3. 移动你AsyncTask成为一个内部类SalesMenu
  4. this.result = resultin onPostExecute(),以及您需要对其进行的任何其他处理。
于 2013-03-06T22:48:39.800 回答
2

除了@Eric 的回答,这是一个非常好的建议(+1),尝试把super.onCreate()before setContentView()。作为一般规则,在重写的 Android 生命周期方法中,超级调用应该在其他任何事情之前发生,并且在这两种方法的情况下尤其重要。

于 2013-03-06T22:49:58.310 回答
0

除了其他优秀的回答。

在您的方法中,为了显示您定期doInBackground()调用的进度,这又会调用. 仅在返回调用。publichProgress()onProgressUpdate()onPostExecute() doInBackground()

AsyncTask 文档中有一个完整的用法示例。

于 2013-03-06T22:52:55.337 回答
0

在执行任何长时间运行的任务时需要考虑以下几点:1) 将它们排除在主线程之外 2) 将 Async 任务类用于短期任务并使它们异步,使用带有线程的处理程序 3) 排除任何长时间运行/繁重的任务oncreate 方法中的任务 4) 在 super.onStart() 之后执行任何任务;在 onStart() 或 onCreate 超级调用下调用。

希望这会帮助你。

于 2014-01-10T11:46:11.077 回答