目标:让ProgressDialog显示“正在加载...”,直到下一个活动完全加载并显示在屏幕上。
尝试将ProgressDialog上下文和活动设置为原始活动。还尝试使用getApplicationContext()和getParentContext()。最后两种方法的例外情况。需要这样做因为目标活动由于非简单的布局文件而呈现缓慢。 (由于组织问题,现在无法解决这个问题。)结果目标活动需要1-2秒才能进入OnCreate,然后屏幕会变黑并持续5秒以上,然后进行绘制。渲染速度很慢。是否使用层次结构查看器进行了审核,看到了很多红球,但现在无法修复。
阅读一些相关但尚未找到解决方法。例如。 What's the difference between the various methods to get a Context?
E.g。两者都崩溃了。使用源活动的“this”也不起作用。
// Context parentContext = this.getParent().getBaseContext();
Context parentContext = this.getApplicationContext();
ProgressDialogMenuable theProgressDialog = new ProgressDialogMenuable(parentContext,this);
theProgressDialog.setTitle("yeeha");
theProgressDialog.setMessage("weewah");
theProgressDialog.setIndeterminate(true);
theProgressDialog.setCancelable(true);
theProgressDialog.show();
另外,奇怪的是,当我这样做时没有任何反应: theProgressDialog.show(); ActivityHelper.changeActivity(this,v,InsMyHoldingsActivity.class,extraMap,-1,-1); 用户单击按钮以显示下一个活动,但ProgressDialog与活动启动冲突,除按钮变为黄色触控外,实际上没有任何其他操作。下面的按钮有效。删除ProgressDialog创建,它的工作原理。没有记录控制台消息。肯定会给开发人员一点点。
答案 0 :(得分:11)
您可以显示这样的进度对话框 -
定义此
private ProgressDialog pd = null;
在您的活动类
中把它放在你的onCreate(这里不直接setContentView)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.pd = ProgressDialog.show(this, "Fancy App",
"Loading...Please wait...", true, false);
// Start a new thread that will download all the data
new IAmABackgroundTask().execute();
}
//背景重举
class IAmABackgroundTask extends
AsyncTask<String, Integer, Boolean> {
@Override
protected void onPreExecute() {
// showDialog(AUTHORIZING_DIALOG);
}
@Override
protected void onPostExecute(Boolean result) {
// Pass the result data back to the main activity
ActivityName.this.data = result;
if (ActivityName.this.pd != null) {
ActivityName.this.pd.dismiss();
}
setContentView(R.layout.main);
}
@Override
protected Boolean doInBackground(String... params) {
//Do all your slow tasks here but dont set anything on UI
//ALL ui activities on the main thread
return true;
}
}
另外请访问:http://developer.android.com/training/improving-layouts/index.html以优化布局性能。 还可以使用Traceview查找瓶颈
答案 1 :(得分:3)
有两种方式
第一种方法使用异步任务
如果您正在执行繁重的任务,例如从服务器加载数据或在这种情况下解析xml,请使用AsynTask&lt;&gt;如果您想从ActivityA调用ActivityB,那么
* step-1 *创建一个AsyncTask类。在doBackground()方法中编写所有后台任务,在完成任务后,你要调用一个代码写入onPostExecute()后执行方法的活动
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.view.View;
public class LoadingDataFromServer extends AsyncTask {
Context currentContext = null;
boolean isCancelled = false;
public LoadingDataFromServer(Context context) {
currentContext = context;
}
@Override
protected void onPreExecute() {
if (DashboardActivity.progressBarLayout != null) {
DashboardActivity.progressBarLayout.setVisibility(View.VISIBLE);
// Log.i(TAG,".....Now make progress bar visible.....");
}
super.onPreExecute();
}
@Override
protected Object doInBackground(Object... params) {
// do background processing
try {
// do background tasks eg sever communication
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object result) {
// TODO Auto-generated method stub
// progressDialog.dismiss();
// call second Activity
Intent i = new Intent(currentContext, com.ActvityB.class);
super.onPostExecute(result);
}
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
isCancelled = true;
super.onCancelled();
}
}
步骤2在您要跳转到新活动的活动中(例如在ActivityA中)调用AsynTask的execute()
new LoadingDataFromServer(context).execute(null);
第二种方法
首先显示进度对话框。 创建一个线程来完成所有后台任务。当线程完成任务然后取消进度对话框并调用下一个活动
或
当线程完成任务然后调用下一个活动传递此对象(进度对话框)并在该新活动内部关闭此对话框。
答案 2 :(得分:0)
这是我的代码,可以提供帮助。
在此,我只发布AsyncTask
的第一种方法,即onPreExecute
。
User_AsyncTask扩展了AsyncTask:
public class User_AsyncTask extends AsyncTask<String, String, String>
{
String response = "";
@Override
protected void onPreExecute()
{
try
{
if (progressDialog != null)
progressDialog.cancel();
}
catch (Exception e)
{
}
progressDialog = ProgressDialog.show(DisplayDetails.this, "", "Please wait...", true, true);
progressDialog.setCancelable(false);
progressDialog.show();
}