What is the difference between loader or AsyncTask? [closed]

僤鯓⒐⒋嵵緔 提交于 2019-12-09 10:56:52

问题


I want to know the difference between Android loader and AsyncTask , here the demo on Loader:

package com.android.loaderdemo;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.AsyncTaskLoader;
import android.content.Context;
import android.content.Loader;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;

import com.android.webprocessor.Http_GetServices;

public class MainActivity extends Activity implements LoaderCallbacks<String> {
    TextView txt_username, txt_userEmail, txt_password, txt_role, txt_secretQuestion, txt_answer, txt_zipcode;

    private static String url = "http://dotstg1.xyz.com/loud/webservcies/GetUserProfile.svc/GetUserProfile/124";
    static String response;
    static String name, email, Pasword, Answer, RoleId, SecretQuestion, Zip;

    static String useResult = null;

    static JSONArray userParams = null;

    private static final int THE_LOADER = 0x01;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("onCreate", "onCreate");
        // getSuLoaderManager().initLoader(THE_LOADER, null, this).forceLoad();
        getLoaderManager().initLoader(THE_LOADER, null, this).forceLoad();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        Log.e("onCreateOptionsMenu", "onCreateOptionsMenu");
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public Loader<String> onCreateLoader(int arg0, Bundle arg1) {
        Log.e("onCreateLoader", "onCreateLoader");
        SampleLoader loader = new SampleLoader(this);

        return loader;
    }

    @Override
    public void onLoadFinished(Loader<String> arg0, String arg1) {
        txt_username = (TextView) findViewById(R.id.name);
        txt_userEmail = (TextView) findViewById(R.id.email);
        txt_password = (TextView) findViewById(R.id.password);
        txt_role = (TextView) findViewById(R.id.role);
        txt_secretQuestion = (TextView) findViewById(R.id.secretquestion);
        txt_zipcode = (TextView) findViewById(R.id.zipcode);
        txt_answer = (TextView) findViewById(R.id.answer);

        txt_username.setText(name);
        txt_userEmail.setText(email);
        txt_password.setText(Pasword);
        txt_role.setText(RoleId);
        txt_secretQuestion.setText(SecretQuestion);
        txt_answer.setText(Answer);
        txt_zipcode.setText(Zip);
        Log.e("onLoadFinished", "onLoadFinished");
    }

    @Override
    public void onLoaderReset(Loader<String> arg0) {
        Log.e("onLoaderReset", "onLoaderReset");

    }

    private static class SampleLoader extends AsyncTaskLoader<String> {

        @Override
        public Context getContext() {
            Log.e("getContext", "getContext");
            return super.getContext();
        }

        @Override
        public int getId() {
            Log.e("getId", "getId");
            return super.getId();
        }

        public SampleLoader(Context context) {

            super(context);
            Log.e("SampleLoader", "SampleLoader");
        }

        @Override
        public String loadInBackground() {
            Log.e("loadInBackground", "loadInBackground");
            try {
                response = Http_GetServices.connect(url);
                JSONObject jsonObject = new JSONObject(response);
                JSONObject json2 = jsonObject.getJSONObject("GetUserPrfResult");
                String test = (String) json2.get("Descritption");
                JSONObject json3 = json2.getJSONObject("GetUserPrfParams");

                name = (String) json3.get("Name");
                email = (String) json3.get("Email");
                Pasword = (String) json3.get("Pasword");
                RoleId = String.valueOf(json3.getInt("RoleId"));
                SecretQuestion = String.valueOf(json3.get("SecretQuestion"));
                Answer = (String) json3.get("Answer");
                Zip = String.valueOf(json3.get("Zip"));

            }
            catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

    }

}

回答1:


From here:

One subclass of Loaders is the AsyncTaskLoader. This class performs the same function as the AsyncTask, but a bit better. It can handle Activity configuration changes more easily, and it behaves within the life cycles of Fragments and Activities. The nice thing is that the AsyncTaskLoader can be used in any situation that the AsyncTask is being used. Anytime data needs to be loaded into memory for the Activity/Fragment to handle, The AsyncTaskLoader can do the job better.




回答2:


In my opinion: Loader is better. because I used AsyncTask a year before , that's a really nightmare for me , because you can't control the whole progress immediately , like sometimes , there is also a asynctask run on the activity,but you want to quit the activity ,you should call asynctask.cancel() , but ,this method : cancel() is not cancel the asynctask straightway.so in this case ,you application will crash due to this . so , if you use asynctask , you must be careful about how to cancel the task .



来源:https://stackoverflow.com/questions/24778226/what-is-the-difference-between-loader-or-asynctask

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!