Android AsyncTask运行时出现黑屏

Android AsyncTask运行时出现黑屏,android,android-asynctask,progress-bar,Android,Android Asynctask,Progress Bar,我不太习惯在这里提问,所以对此的任何建议都将不胜感激……但对于我的问题: 我正在尝试从一个活动切换到另一个活动,在这里我将显示来自服务器的一些数据。我通过AsyncTask从服务器中提取数据,但当下载时间较长时,活动之间会显示黑屏。我已经尝试将AsyncTask从onCreate()放到onStart(),但没有做任何更改 新活动: public class SalesMenu extends Activity { @Override protected void onCreate(Bundl

我不太习惯在这里提问,所以对此的任何建议都将不胜感激……但对于我的问题:

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

}
公共类SalesMenu扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
requestWindowFeature(Window.FEATURE\u不确定\u进度);
setContentView(R.layout.sales_菜单);
SetProgressBarInDeterminateVibility(真);
super.onCreate(savedInstanceState);
}
@凌驾
受保护的void onStart(){
列表结果=空;
AsyncTask aTask=新建AsyncSearchRead(
“销售订单”,
新对象[0],
新字符串[]{“名称”},
这是一个)execute();
试一试{
结果=aTask.get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
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);
}

}
公共类AsyncSearchRead扩展了AsyncTask{
字符串模型;
布尔计数;
整数mOffset;
整数mLimit;
细纱机;
布尔平均顺序;
对象[]条件;
字符串[]mFields;
活动父母活动;
公共AsyncSearchRead(字符串模型、布尔计数、整数偏移量、整数限制、,
字符串顺序、布尔反转顺序、对象[]条件、字符串[]字段、,
活动(活动){
mModel=模型;
mCount=计数;
mOffset=偏移量;
mLimit=极限;
莫德=秩序;
mReverseOrder=反向订单;
M条件=条件;
mFields=字段;
家长活动=活动;
}
@凌驾
受保护列表doInBackground(无效…参数){
长[]ID;
列出结果;
//下载数据
ids=SetServer.connection.search(mModel、mCount、mOffset、mLimit、mOrder、mReverseOrder、mcconditions);
结果=SetServer.connection.read(mModel、ids、mFields);
返回结果;
}
@凌驾
受保护的void onPostExecute(列表结果){
parentActivity.SetProgressBarInDeterminateVibility(false);
}
}
当我没有在PostExecute上关闭可见性时,它在显示活动后继续旋转,但它仅在加载后显示

我如何才能让它显示活动,并且仅在该活动之后才开始加载数据并显示一些进度条/加载程序

谢谢您的帮助。

这是因为您正在使用
.get()
本质上是同步的(使主线程等待,直到完成),因此基本上就像根本不运行
AsyncTask

我的建议如下:

  • 移动
    列表结果=null
    作为成员变量
  • 删除整个
    try/catch
    语句(其中包含
    .get()
    )和对
    Log.*
    的调用
  • 将您的
    AsyncTask
    移动为
    sales菜单的内部类
  • 执行
    onPostExecute()
    中的
    this.result=result
    ,以及需要对其执行的任何其他处理

  • 除了@Eric的答案,这是一个非常好的建议(+1),尝试将
    super.onCreate()
    放在
    setContentView()之前。一般来说,在被覆盖的Android生命周期方法中,超级调用应该在任何其他方法之前发生,并且在这两种方法中尤其重要。

    除了其他优秀的ASNWER之外

    doInBackground()
    方法中,要显示进度,您需要定期调用
    publichProgress()
    ,然后调用
    onProgressUpdate()
    onPostExecute()
    仅在返回后调用
    doInBackground()


    中有一个完整的使用示例。

    在执行任何长时间运行的任务时,需要考虑以下几点: 1) 让它们远离主线程 2) 对短期任务使用异步任务类并使其异步,对线程使用处理程序 3) 避免oncreate方法执行任何长时间运行/繁重的任务 4) 在super.onStart()之后执行任何任务;在onStart()下调用或onCreate超级调用


    希望这对您有所帮助。

    调用result=aTask.get();您正在强制当前线程(UI)等待get()给出的结果,该结果仅在任务完成后发生。True。但这并不是这个问题的答案。。更多的是一个评论。。说得对。我认为这些方法的顺序可能是黑屏的具体原因,尽管从.get()开始的UI阻塞似乎是问题的根源。谢谢别担心。。你仍然会因为提出了一个好的观点而获得互联网积分。这确实不是一个问题,但感谢你澄清了超级电话。我真的不知道应该把它们放在正确的位置。谢谢你的建议,它确实有助于摆脱。get()。尽管我没有将它作为一个内部类,因为我想从更多的类中使用它…希望这样使用它没有错。