AsyncTask运行时出现黑屏

时间:2013-03-06 22:44:49

标签: android android-asynctask progress-bar

我很想在这里提问,所以对此的任何建议都会受到赞赏......但是我的问题是:

我正在尝试从一个活动切换到另一个活动,在那里我将显示来自服务器的一些数据。我通过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();
}

}

我的AsyncTask:

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 个答案:

答案 0 :(得分:8)

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

我的建议如下:

  1. List<HashMap<String, Object>> result = null;移至成员变量。
  2. 删除整个try/catch语句(其中包含.get()的语句),以及对Log.*的调用。
  3. 将您的AsyncTask移至SalesMenu的内部类。
  4. this.result = result中的onPostExecute(),以及您需要处理的其他任何处理。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

除了其他优秀的asnwers。

doInBackground()方法中,为了显示进度,您定期拨打publichProgress(),然后拨打onProgressUpdate()onPostExecute()仅被称为 AFTER doInBackground()已返回。

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

答案 3 :(得分:0)

在执行任何长时间运行的任务时,有一些要点需要考虑: 1)使它们脱离主线程 2)对短期任务使用异步任务类并使它们成为异步,使用带有线程的处理程序 3)通过oncreate方法保留任何长时间运行/繁重的任务 4)在super.onStart()之后执行任何任务;在onStart()或onCreate super calls下调用。

希望这会帮助你。

相关问题