9

目標: 次のアクティビティが完全に読み込まれて画面に表示されるまで、「読み込み中...」と表示される ProgressDialog を用意します。

ProgressDialog コンテキストとアクティビティを元のアクティビティに設定してみました。getApplicationContext() と getParentContext() も試してみました。最後の 2 つのアプローチの例外。単純でないレイアウト ファイルが原因で宛先アクティビティのレンダリングが遅いため、これを行う必要があります。(組織の問題のため、現在は修正できません。) 目的のアクティビティが OnCreate に 1 ~ 2 秒かかり、画面が最大 5 秒以上黒くなり、ペイントすることが判明しました。レンダリングが遅いだけです。Hierarchy Viewer で確認したところ、多くの赤いボールが表示されましたが、現在は修正できません。

関連するいくつかを読んでくださいが、修正は見つかりませんでした。たとえば、コンテキストを取得するためのさまざまな方法の違いは何ですか?

たとえば、これらの両方がクラッシュします。ソースアクティビティの「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(これ、v、InsMyHoldingsActivity.class、extraMap、-1、-1); ユーザーはボタンをクリックして次のアクティビティを表示しますが、ProgressDialog がアクティビティの起動と競合し、ボタンが黄色のオンタッチになる以外は実際には何も起こりません。下のボタンが機能します。ProgressDialog の作成を削除すると機能します。コンソール メッセージは記録されません。確かに、開発者にとっては少し不快です。

4

3 に答える 3

12

次のような進行状況ダイアログを表示できます-

これを定義する

private ProgressDialog pd = null;

あなたの活動クラスで

これをonCreateに入れます(ここでContentViewを直接設定しないでください)

@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 も参照してください。また、トレースビューを使用してボトルネックを探します

于 2012-10-23T09:00:58.437 に答える
3

には2つの方法があります

最初のアプローチ Async Task を使用するには

サーバーからのデータの読み込みや xml の解析などの重いタスクを実行している場合は、AsynTask<> を使用します 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();
    }

}

step-2 新しいアクティビティにジャンプしたい場所のアクティビティで (たとえば、ActivityA で)、AsynTask の execute() を呼び出します。

new LoadingDataFromServer(context).execute(null);

2 番目のアプローチ

最初に進行状況ダイアログを表示します。すべてのバックグラウンド タスクを実行するスレッドを作成します。スレッドがタスクを完了したら、進行状況ダイアログをキャンセルして次のアクティビティを呼び出します

また

スレッドがタスクを完了したら、次のアクティビティを呼び出してこのオブジェクトを渡し (進行状況ダイアログ)、その新しいアクティビティ内でこのダイアログを閉じます。

于 2012-10-23T06:51:34.840 に答える