1

doInBackground()次のようなメソッドを使用した非同期タスクがあります。

       protected String doInBackground(String... params) {
          MyClass session = new MyClass("email", "password");
          return session.isAuthorized();
       }

MyClass完全に別のパッケージに入っている一方、次のようなものです。

       private class MyClass {
                  // fields, constructors, etc
                  public Boolean isAuthorized() {
                             // some stuff
                             log("Action 1...");
                             // some stuff
                             log("Action 2...");
                             // some other stuff
                             return result;
                  }

                  public static void log(String str) {
                             // HERE I would like to publish progress in the Async Task
                             // but, until now, it's kinda like:
                             System.out.println(str);
                  }
       }

問題は、メソッドに保持されているログの説明log()を、メインのアクティビティ「コンテナー」の外部であっても、メソッドに渡すにはどうすればよいpublishProgress()ですか? 私はすでにこのスレッドを読みました:非同期タスクで進行状況ダイアログのメッセージを変更するのが難しい- しかし、私のメソッドはメインクラスに含まれていないため、有効なヘルプソースではありませんでしたpublic class MainActivity extends Activity {}

編集#1 -

いくつかの作業の後、唯一の方法は「メイン」スレッドへの参照を外部クラスに渡し、そこに特定のメソッドを実装して進行状況を公開することであることに気付きました。そのような方法で:

       public void log(String str) {
                  if (mThreadReference==null) {
                             System.out.println(str);
                  } else {
                             mThreadReference.doProgress();
                  }
       }

これをmThreadReference指している間AsyncTask

    private class MyClassTask extends AsyncTask<String,String,String>  {
        @Override
        protected String doInBackground(String... params) {
            // constructs MyClass instance with a reference and run main method
            (new MyClass("email", "password", this)).isAuthorized();
        }

        public void doProgress(String str) {
            publishProgress(str);
        }

        @Override
        protected void onProgressUpdate(String... values) {
            // some stuff
        }
        @Override
        protected void onPostExecute(String result) {
        }
    }

しかし、明らかに、Eclipse は私に警告しています: The method publishProgress() is undefined for the type Activity. 複数の特定の AsyncThread で使用できる一般的絶対的なメソッドを外部クラスに記述するにはどうすればよいですか?

                           --> LOGs IN THE LOGIN THREAD 1
                          /
           EXTERNAL CLASS ---> LOGs IN THE LOGIN THREAD 2
                          \
                           --> LOGs IN THE LOGIN THREAD 3
4

2 に答える 2

0

今日、私は同様の問題に直面しました。以前の回答は、問題の 50% を解決するのに役立ちました。mThreadReference が null であるため、null ポインター例外でした。

ここで、AsyncTask クラスである内部クラスをインスタンス化するために、囲んでいるクラスのインスタンスが必要です。フラグメント内でそのようなクラスを定義していたので、私がしたことは以下のとおりです。

    MyFragment fm = new MyFragment();
    MyFragment.AsyncTaskClassName aTCN = fm.new AsyncTaskClassName();

その後、ジャンルンカが提案した方法で doProgress メソッドを呼び出すことができます。

私の2セント!!

于 2013-07-24T04:39:27.897 に答える