我很想在这里提问,所以对此的任何建议都会受到赞赏......但是我的问题是:
我正在尝试从一个活动切换到另一个活动,在那里我将显示来自服务器的一些数据。我通过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的可见性时,它在显示活动后继续旋转,但它仅在加载后显示。
如何让它显示活动,并且只有在开始加载数据并显示一些进度条/加载器之后?
感谢您的帮助。
答案 0 :(得分:8)
这是因为你正在使用.get()
。 .get()
基本上使AsyncTask
同步(使主线程等到它完成),所以它基本上就像没有运行AsyncTask
。
我的建议如下:
List<HashMap<String, Object>> result = null;
移至成员变量。try/catch
语句(其中包含.get()
的语句),以及对Log.*
的调用。AsyncTask
移至SalesMenu
的内部类。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下调用。
希望这会帮助你。