0

AsyncTask を使用して Web サービスへの HTTP 呼び出しを行うアプリケーションのリファクタリングを行っています。

このように AsyncTask を使用してサービスを呼び出す必要があるときは、単純なアクティビティを使用します。

  private class MyAsyncTask extends AsyncTask {<String, Void, Boolean>
    private ProgressDialog progressDialog;


    private xmlHandler handler;

    @ Override
    protected void OnPreExecute () {
    progressDialog = new ProgressDialog (home.This);
    progressDialog
    . SetMessage (getString (R.string.home_loadinfo_attendere));
    progressDialog.setCancelable (false);
    progressDialog.show ();
    }

    @ Override
    protected Boolean doInBackground (String... params) {
    try {
    xmlHandler handler = new XmlHandler();
    return Service
    . GetInstance ()
    . CallService (
    ServiceType.GETINFO,
    Home.This, handler, null);
    } Catch (Exception e) {
    e.printStackTrace ();
    return false;
    }
    }

    @ Override
    protected void OnPostExecute (Boolean success) {
    progressDialog.dismiss ();

    String message = null;
    if (success | | (handler == null))
    message = getString (R.string.server_result_msg500);
    else {
    switch (handler.getStatusCode ()) {
    case 200:
    doStuffWithHandler(handler);
    return;
    case 500:
    message = getString (R.string.server_result_msg500);
    break;
    case 520:
    message = getString (R.string.server_result_msg520);
    break;
    default:
    message = getString (R.string.server_result_msg500);
    break;

    }
    }

    if (message! = null) {

    AlertDialog.Builder builder = new AlertDialog.Builder (home.This);
    builder.setTitle (R.string.home_loadinfo_error_title)
    . SetMessage (message)
    . SetCancelable (true)
    . SetNegativeButton (R.string.close_title,
    new DialogInterface.OnClickListener () {
    @ Override
    public void onClick (DialogInterface dialog,
    int id) {
    dialog.cancel ();

    }
    });
    AlertDialog alert = builder.create ();
    Alert.show ();
    }
    }
    }

 doStuffWithHandler(handler){

// populate interface with data from service

 }

同じことをしたいのですが、Android 互換性ライブラリと FragmentActivity を使用します。ローダーについて少し読みましたが、同じ方法でそれらを使用する方法がわかりませんでした。これが正しい方法 (FragmentActivity、Fragment、およびローダー) であるかどうか、およびそれを実装する方法について教えてください。

4

2 に答える 2

0

アクティビティで行ったのとまったく同じように、フラグメントで Asynctask を使用できます。次のようないくつかの変更があります。

 progressDialog = new ProgressDialog (home.This);

への変更:

progressDialog = new ProgressDialog (getApplication());



 return Service
    . GetInstance ()
    . CallService (
    ServiceType.GETINFO,
    Home.This, handler, null);

への変更:

return Service
. GetInstance ()
. CallService (
ServiceType.GETINFO,
getApplication(), handler, null);

Fragment で Asynctask を実装するための特別なもの。Fragment自体についてもっと読む必要があると思います。

于 2013-02-04T19:07:47.007 に答える
0

次のようなローダーを作成できます。

public abstract class MyLoader extends AsyncTaskLoader<String> {
public MyLoader(Context context) {
    super(context);
}

private String result;
protected String error;

@Override
public final String loadInBackground() {
    try {
        error = null;
        // Load your data from the server using HTTP
        ...
        result = ...
        ...
        return result;
    }
    catch (Exception e) {
        Logger.e("ResourceLoader", "Loading resource failed.", e);
        error = e.getMessage();
    }
    return null;
}

@Override
protected void onStartLoading() {
    if (!TextUtils.isEmpty(error)) {
        deliverResult(result);
    }

    if (takeContentChanged()) {
        forceLoad();
    }
}

@Override
public void deliverResult(String data) {
    if (isReset()) {
        return;
    }

    result = data;

    if (isStarted()) {
        try {
            super.deliverResult(data);
        }
        catch(Exception e) { 
            Log.e("ResourceLoader", "Caught exception while delivering result.", e);
        }
    }
}

public String getError() {
    return error;
}
}

Fragment で、このローダーを初期化できます。

public class MyLoaderFragment extends Fragment implements LoaderCallbacks<String> {
....
....
String message;

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setRetainInstance(true);
        ....
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    getLoaderManager().initLoader(0, getArguments(), this);
}

@Override
public Loader<String> onCreateLoader(int id, Bundle args) {
    return new MyLoader(getActivity());
}

@Override
public void onLoadFinished(Loader<String> loader, String result) {
    // Here you have the result in 'result'.
    message = result;
    ...
}
....
}

また、単純な「文字列」の結果を返すだけでなく、任意のオブジェクトを返すことができます。それに応じて MyLoader と LoaderCallbacks の実装を調整するだけです。

于 2013-02-04T19:52:51.510 に答える