【问题标题】:What is the difference between loader or AsyncTask? [closed]loader 和 AsyncTask 有什么区别? [关闭]
【发布时间】:2014-07-16 10:15:56
【问题描述】:

我想知道 Android loader 和 AsyncTask 的区别, 这里是 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;
        }

    }

}

【问题讨论】:

标签: android android-asynctask loader


【解决方案1】:

在我看来:Loader 更好。因为我一年前使用了 AsyncTask,这对我来说真是一场噩梦,因为你无法立即控制整个进度,比如有时,活动上还有一个 asynctask 运行,但你想退出活动,你应该调用asynctask.cancel(),但是,这种方法:cancel() 不是直接取消异步任务。所以在这种情况下,您的应用程序将因此而崩溃。所以,如果你使用异步任务,你必须小心如何取消任务。

【讨论】:

    【解决方案2】:

    来自here

    Loaders 的一个子类是 AsyncTaskLoader。这个班执行 与 AsyncTask 的功能相同,但要好一些。它可以处理 Activity 配置更容易更改,并且它在 片段和活动的生命周期。好消息是 AsyncTaskLoader 可以在 AsyncTask 所在的任何情况下使用 正在使用。任何时候都需要将数据加载到内存中 要处理的 Activity/Fragment,AsyncTaskLoader 可以完成这项工作 更好。

    【讨论】:

      猜你喜欢
      • 2021-01-24
      • 1970-01-01
      • 2010-12-10
      • 2011-09-20
      • 2013-03-25
      • 2023-03-08
      • 2016-07-17
      • 2015-07-17
      • 2014-07-11
      相关资源
      最近更新 更多