0

メインアクティビティ内でサブクラスを使用して asynctask を実行しています。後で別のファイルに移動する予定です。動作していることを確認するために、この方法を好むだけです。HTTPRequest待ち時間が長くなる可能性があるため、進行状況ダイアログを使用しようとしています。doInBackground()そこからUIレイヤーにアクセスできないと読んだので、私は何もしていません。最終的に何が起こっているかというと、進行状況ダイアログを表示してonPreExecute()で閉じonPostExecute()ます。上記の各タスクを個別に呼び出していますが、これが問題の 99% である可能性がありますが、タスクが適切に機能するためには、アクティビティをタスクに渡すことができる必要があります。

多くのステップを細かく分割しました。私の問題は execute() を使用していないことが原因であると信じるように導くヌルポインター例外が発生していますが、それがどのように機能するかを理解できないようです。

new CodeRetrievalItem().onPreExecute(MyActivity.this);

new CodeRetrievalItem().onPostExecute(MyActivity.this);

class CodeRetrievalItem extends AsyncTask<Void, Void, Void>{

ProgressDialog dialog;
protected void onPreExecute(Activity actpass){
        dialog = new  ProgressDialog(actpass);
    dialog.setMessage("Loading");
    dialog.setIndeterminate(false); 
    dialog.setCancelable(false);
    dialog.show();

}

@Override
protected Void doInBackground(Void... arg0) {
    // TODO Auto-generated method stub
    return null;
}

protected void onPostExecute(Activity actpass){

            // Execute HTTP Request
    try{
        dialog.dismiss();
    }
    catch(Exception e){
        Toast.makeText(actpass, "IOE response " + e.toString(), Toast.LENGTH_LONG).show();
    }

}

}
4

2 に答える 2

2

あなたはAsyncTask完全に間違った使い方をしています。あなたのコードにはいくつかの重大な誤りがあります。

AsyncTask 保護メソッド

それらを自分で呼び出さないでください。AsyncTaskのドキュメントには、次のものがあります。

onPreExecute()、onPostExecute(Result)、doInBackground(Params...)、onProgressUpdate(Progress...) を手動で呼び出さないでください。

AsyncTaskメソッドを呼び出して開始する必要がありますexecute(Params...)。これにより、次のことが発生します。

  1. onPreExecute()バックグラウンド実行の開始前に呼び出され、メインスレッドで呼び出されます
  2. doInBackground(Params...)バックグラウンドで呼び出される
  3. バックグラウンド実行が終了onPostExecute(Result)すると、メインスレッドで呼び出されます。

何も呼び出さexecute(Params...)ない限り、これは起こりません。

汎用パラメーター

さらに、ジェネリック パラメータに問題があります。AsyncTaskには3つの汎用パラメーターがありAsyncTask<Params, Progress, Result>ます(あなたの場合AsyncTask<Void, Void, Void>、メソッドのパラメーターでこれらのパラメーターを一致させる必要があります)。

したがって、次を作成します。

  1. onPreExecute()それ以外のonPreExecute(Activity actpass)
  2. onPostExecute(Void)それ以外のonPostExecute(Activity actpass)

定義したこれらのメソッドは、非同期実行にバインドされていません。クラス内の追加のメソッドにすぎません。

内部のアクティビティにアクセスする必要がある場合はAsyncTask、別の方法 (コンストラクターなど) で渡します。Activityを に渡すとメモリ リークが発生するAsyncTask可能性があることに注意してください(ここで使用することをお勧めします) 。適切に処理しないとWeakReference<T>、ダイアログにアクセスするとクラッシュする可能性があります。onPostExecute(Result)

于 2012-12-21T13:20:13.950 に答える
1

このようにコードを変更します

new CodeRetrievalItem(MyActivity.this).execute();



class CodeRetrievalItem extends AsyncTask<Void, Void, Void>{
Activity context;
public CodeRetrievalItem(Activity actpass)
{
context=actpass;
}
ProgressDialog dialog;
protected void onPreExecute(Activity actpass){
        dialog = new  ProgressDialog(context);
    dialog.setMessage("Loading");
    dialog.setIndeterminate(false); 
    dialog.setCancelable(false);
    dialog.show();

}

@Override
protected Void doInBackground(Void... arg0) {
    // TODO Auto-generated method stub
    return null;
}

protected void onPostExecute(Activity actpass){

            // Execute HTTP Request
    try{
        dialog.dismiss();
    }
    catch(Exception e){
        Toast.makeText(context, "IOE response " + e.toString(), Toast.LENGTH_LONG).show();
    }
于 2012-12-21T12:54:55.617 に答える