AsyncTask运行时出现黑屏

mic*_*c3r 1 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();
}

}
Run Code Online (Sandbox Code Playgroud)

我的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);
}

}
Run Code Online (Sandbox Code Playgroud)

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

如何让它显示活动,并且只有在开始加载数据并显示一些进度条/加载器之后?

谢谢你的帮助.

Eri*_*ric 8

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

我的建议如下:

  1. 移动List<HashMap<String, Object>> result = null;成为成员变量.
  2. 删除整个try/catch语句(包含在其中的语句.get())和调用Log.*.
  3. 移动你AsyncTask成为一个内在的阶级SalesMenu.
  4. 不要this.result = resultonPostExecute(),以及你需要它做任何其他处理.