我想知道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;
}
}
}
答案 0 :(得分:8)
来自here:
Loaders的一个子类是AsyncTaskLoader。这堂课表演 与AsyncTask功能相同,但更好一点。它可以处理 活动配置更容易更改,并且其行为在 碎片和活动的生命周期。好消息是 AsyncTaskLoader可用于AsyncTask的任何情况 正在使用。任何时候都需要将数据加载到内存中 要处理的Activity / Fragment,AsyncTaskLoader可以完成这项工作 更好。
答案 1 :(得分:5)
在我看来:装载机更好。因为我在一年前使用过AsyncTask,这对我来说真的是一场噩梦,因为你无法立即控制整个进程,就像有时候,在活动上还有一个asynctask运行,但是你想要退出活动,你应该调用asynctask.cancel()
,但是,这个方法:cancel()
不会直接取消asynctask.so在这种情况下,你的应用程序会因此而崩溃。所以,如果你使用asynctask,你必须小心如何取消任务。