Android AsyncTask运行时出现黑屏
我不太习惯在这里提问,所以对此的任何建议都将不胜感激……但对于我的问题: 我正在尝试从一个活动切换到另一个活动,在这里我将显示来自服务器的一些数据。我通过AsyncTask从服务器中提取数据,但当下载时间较长时,活动之间会显示黑屏。我已经尝试将AsyncTask从onCreate()放到onStart(),但没有做任何更改 新活动: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
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()。尽管我没有将它作为一个内部类,因为我想从更多的类中使用它…希望这样使用它没有错。