1

すべてのアクティビティが URL からコンテンツをダウンロードするために使用/共有する一般的な AsynceTask クラスを作成したいと考えています。このため、OnPostExecute には、AsyncTask クラスを呼び出したアクティビティ内の何らかのメソッドにコンテンツを送り返す以外のことはしたくありません。

を呼び出したアクティビティのコンテキストを設定するコンストラクタを作成する必要があることはわかっていますがAsyncTask、コンテキストを使用して、そのコンテキストに対応するアクティビティに何かを返すにはどうすればよいでしょうか。この方法でコンテキストを使用する方法を示すチュートリアルは見たことがありません。

私が持っているとしましょう:

public class LoginActivity {

    public int ActivityMember;

    public void HandleButtonClick(void){
        DownloadFromURL task = new DownloadFromURL(this);
        task.execute(url);
    }

    public void HandleLoginResult(int x){
        ActivityMember = x;
    }
}

今私が持っている別のJavaファイルに:

    private class DownloadFromURL extends AsyncTask<List<NameValuePair>, Long, JSONObject> {
Context context;

    public void DownloadFromURL (Context context){
        this.context = context;
    }

    @Override
    protected void onPostExecute(JSONObject json) {
         context.(<- *my question involves this part of code)
    }
}

context.ActivityMember、またはcontext.HandleLoginResult(y)内部で呼び出すことはできないと確信しています。onPostExecuteコンテキストはタイプではないためLoginActivity、コンテキストです。LoginActivityでは、そのコンテキストを使用して、に属するメンバーまたはメソッドにアクセスするにはどうすればよいでしょうか?

4

5 に答える 5

1

アクティビティ名をコンテキストとともに非同期クラスに渡します。

    protected void onPostExecute(SoapObject result)
    {

            if(classname.equals("LoginActivity"))
            {
                ((LoginActivity) object).method();
            }
                    else if(classname.equals("MainActivity"))
            {
                ((MainActivity) object).method();
            }


}
于 2013-05-04T06:51:50.347 に答える
0

私がやろうとしていたことを達成する別の方法があることに気づきました。これにより非同期が取り除かれますが、ログインの場合、アプリがログインしようとしている間、実際には UI を非アクティブにしたいと考えています。

電話したら

asyncTask.execute() 

電話できる

asyncTask.get()

これにより、doInBackground の結果が取得され、その場で実行できるようになります。または、タイムアウトを使用して、永久にブロックしないようにすることもできます。

asynceTask.get(5000, TimeUnit.MILLISECONDS)
于 2013-05-04T10:09:18.750 に答える
0

これには、基本的なオブジェクト指向プログラミングの知識が含まれます。

http://developer.android.com/reference/android/app/Activity.htmlをよく見ると、Activity が Context を拡張していることがわかります。そのthisため、AsyncTask コンストラクターに渡して、コンパイラーに必要な処理をさせることができます。オブジェクトのスライス。

これを有利に利用できます: Activity を拡張する抽象クラスを作成し (例: DataActivity としますが、任意の名前を付けonDataDownloadComplete(JSONObject json)ます)、その上に (コールバック) という名前のメソッドを記述します。 AsyncTask のonPostExecute. すべてのアクティビティを DataActivity から拡張し、そのメソッドを実装します。AsyncTask コンテキストを Context から DataActivity に変更して、onDataDownloadCompleteコールバックを呼び出せば完了です。繰り返しになりますが、DataActivity は Activity を拡張し、Activity は Context を拡張するため、DataActivity またはそれを拡張する任意のものは、AsyncTask の有効なコンテキストになります。

これが役に立つことを願っています。

于 2013-05-04T06:51:56.660 に答える