将android AsyncTask调用转换为单独的类并调用所有活动
我是android开发新手。我的应用程序中有一个AsyncTask函数。从所有活动调用http请求。现在在每个活动中,我都使用下面的类连接到服务器,在一些活动中,我甚至调用了两次 基本上,我是一名web开发人员,在这种情况下,我们使用一个可以从整个应用程序(web)访问的类,并使用公共函数执行相同的活动。唯一的区别是输入和输出将会改变 我的疑问是,在这种情况下,我可以使用(转换)这个函数或类吗? 我的假设是将android AsyncTask调用转换为单独的类并调用所有活动,android,web-services,android-layout,android-intent,Android,Web Services,Android Layout,Android Intent,我是android开发新手。我的应用程序中有一个AsyncTask函数。从所有活动调用http请求。现在在每个活动中,我都使用下面的类连接到服务器,在一些活动中,我甚至调用了两次 基本上,我是一名web开发人员,在这种情况下,我们使用一个可以从整个应用程序(web)访问的类,并使用公共函数执行相同的活动。唯一的区别是输入和输出将会改变 我的疑问是,在这种情况下,我可以使用(转换)这个函数或类吗? 我的假设是 创建一个android类(可以从所有活动中访问) 只需为特定服务器生成所需的JSON字符
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_main);
LogIN loginUser = new LogIN();
LoginUser.execute("");
}
private class LogIN extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... sUrl) {
try {
String path = "http://www.domain_name.com/app/checkSession.php";
HttpClient client = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000);
HttpResponse response;
JSONObject json = new JSONObject();
try {
HttpPost post = new HttpPost(path);
json.put("access_token", "123456");
post.setHeader("json", json.toString());
StringEntity se = new StringEntity(json.toString());
se.setContentEncoding((Header) new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(se);
response = client.execute(post);
/* Checking response */
if (response != null) {
InputStream in = response.getEntity().getContent();
String a = convertStreamToString(in);
JSONObject jsono = stringToJsonobj(a);
String passedStringValue = jsono.getString("result");
if(passedStringValue.equals("1")){
flags=1;
//Log.v("TAGG", "Success");
}
else {
flags=0;
//Log.v("TAGG", "Failed !");
}
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialogue("Login Processing", "Loading");
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
}
@Override
protected void onPostExecute(String result) {
if(flags.equals(1)){
Itent homepage = new Intent(MainActivity.this, RegisterDevice.class);
startActivity(homepage);
finish();
}
else {
Intent homepage = new Intent(MainActivity.this, LoginActivity.class);
startActivity(homepage);
finish();
}
super.onPostExecute(result);
}
}
}
Login loginTask = new Long(getContext());
loginTask.execute();
public class Login extends AsyncTask<String, Integer, String> {
private Context mContext ;
private ProgressDialog pd;
private Handler handler = new Handler { };
public Login (Context context){
mContext = context ;
}
.....
公共类MainActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Picture);
setContentView(R.layout.activity_main);
LogIN LogIN用户=新登录();
logiuser.execute(“”);
}
私有类登录扩展异步任务{
@凌驾
受保护的字符串背景(字符串…sUrl){
试一试{
字符串路径=”http://www.domain_name.com/app/checkSession.php";
HttpClient=new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(client.getParams(),10000);
HttpResponse响应;
JSONObject json=新的JSONObject();
试一试{
HttpPost=新的HttpPost(路径);
put(“access_token”,“123456”);
setHeader(“json”,json.toString());
StringEntity se=新的StringEntity(json.toString());
setContentEncoding((标题)新的BasicHeader(HTTP.CONTENT_类型,“application/json”);
邮政实体(se);
响应=client.execute(post);
/*检查响应*/
if(响应!=null){
InputStream in=response.getEntity().getContent();
字符串a=convertStreamToString(in);
JSONObject jsono=StringToJSONObject(a);
字符串passedStringValue=jsono.getString(“结果”);
if(passedStringValue.equals(“1”)){
旗帜=1;
//Log.v(“TAGG”,“Success”);
}
否则{
flags=0;
//Log.v(“TAGG”,“Failed!”);
}
}
}捕获(例外e){
e、 printStackTrace();
}
}捕获(例外e){
}
返回null;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
showDialogue(“登录处理”、“加载”);
}
@凌驾
受保护的void onProgressUpdate(整数…进度){
super.onProgressUpdate(进度);
}
@凌驾
受保护的void onPostExecute(字符串结果){
如果(标志等于(1)){
Itent homepage=新意图(MainActivity.this、RegisterDevice.class);
startActivity(主页);
完成();
}
否则{
意向主页=新意向(MainActivity.this、LoginActivity.class);
startActivity(主页);
完成();
}
super.onPostExecute(结果);
}
}
}
请任何人帮助/建议
提前感谢将您的类提取到另一个文件并公开
public class LogIN extends AsyncTask<Object, Integer, String> {
private ILoginListener listener;
@Override
protected String doInBackground(Object... arg0) {
try {
this.listener = (ILoginListener) arg0[0];
//You can also send the url in the obj array
String theUrl = (String) arg0[1];
String path = "http://www.domain_name.com/app/checkSession.php";
HttpClient client = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000);
HttpResponse response;
JSONObject json = new JSONObject();
try {
HttpPost post = new HttpPost(path);
json.put("access_token", "123456");
post.setHeader("json", json.toString());
StringEntity se = new StringEntity(json.toString());
se.setContentEncoding((Header) new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(se);
response = client.execute(post);
/* Checking response */
if (response != null) {
InputStream in = response.getEntity().getContent();
String a = convertStreamToString(in);
JSONObject jsono = stringToJsonobj(a);
String passedStringValue = jsono.getString("result");
if(passedStringValue.equals("1")){
flags=1;
//Log.v("TAGG", "Success");
}
else {
flags=0;
//Log.v("TAGG", "Failed !");
}
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialogue("Login Processing", "Loading");
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
}
@Override
protected void onPostExecute(String result) {
listener.logInSessionCheckListener(flag.equals(1));
super.onPostExecute(result);
}
}
我在需要postExecute结果的类中实现了接口,在重写的方法中,您可以使用任务的结果实现所需的内容。
您使用它的类将如下所示:
public interface ILoginListener {
public void logInSessionCheckListener(SomeNeeded Value);
}
public class SomeClass implements ILoginListener {
//Call it like this from any class:
LogIN loginTask = new LogIn();
Object[] someParams = new Object[2];
//add the listener
someParams[0] = SomeClass.this
//add the url
someParams[1] = someUrlString;
loginTask.execute(someParams);
@Override
public void logInSessionCheckListener(SomeNeeded Value){
//do Stuff with your results
}
}
new LogIN().execute(urls);
您可以像为doInBackground()方法中的所有内容创建单独的类一样,在所有活动中调用它,并将参数传递给
LogIN loginUser = new LogIN(yourparameter);
LoginUser.execute("");
并检查AsyncTask类构造函数中的参数,如
public LogIN(Myparameter){
// Your data
}
另一方面,你可以使用这个很棒的android框架:和。
它允许您从活动中执行异步网络任务,并轻松处理请求的结果。您应该使用接口实现对ui活动的回调。 看看这个线程,它可能很有用: 您的asyntask类应该位于一个单独的java文件中,并具有公共访问权限 要传递参数,只需调用新的登录异步任务,如下所示:
public interface ILoginListener {
public void logInSessionCheckListener(SomeNeeded Value);
}
public class SomeClass implements ILoginListener {
//Call it like this from any class:
LogIN loginTask = new LogIn();
Object[] someParams = new Object[2];
//add the listener
someParams[0] = SomeClass.this
//add the url
someParams[1] = someUrlString;
loginTask.execute(someParams);
@Override
public void logInSessionCheckListener(SomeNeeded Value){
//do Stuff with your results
}
}
new LogIN().execute(urls);
希望对您有所帮助:)记住,您永远无法知道任务何时完成。因此,如果您使用它对用户进行身份验证,然后执行任务X、任务Y或任务Z 那么也许最好创建一个登录助手类 公共类登录器{
public boolean login(params){
// Authenticate user and return true if successfull
}
}
然后在你的活动课上
私有类X扩展异步任务{
@Override
protected String doInBackground(String... sUrl) {
...
boolean authenticated = LoginHelper.login(params...);
if(authenticated == true) {
// Perform task X here...
} else {
// Inform the user that the login failed...
}
}首先
您必须传递调用异步任务的上下文
示例代码
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_main);
LogIN loginUser = new LogIN();
LoginUser.execute("");
}
private class LogIN extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... sUrl) {
try {
String path = "http://www.domain_name.com/app/checkSession.php";
HttpClient client = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000);
HttpResponse response;
JSONObject json = new JSONObject();
try {
HttpPost post = new HttpPost(path);
json.put("access_token", "123456");
post.setHeader("json", json.toString());
StringEntity se = new StringEntity(json.toString());
se.setContentEncoding((Header) new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(se);
response = client.execute(post);
/* Checking response */
if (response != null) {
InputStream in = response.getEntity().getContent();
String a = convertStreamToString(in);
JSONObject jsono = stringToJsonobj(a);
String passedStringValue = jsono.getString("result");
if(passedStringValue.equals("1")){
flags=1;
//Log.v("TAGG", "Success");
}
else {
flags=0;
//Log.v("TAGG", "Failed !");
}
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialogue("Login Processing", "Loading");
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
}
@Override
protected void onPostExecute(String result) {
if(flags.equals(1)){
Itent homepage = new Intent(MainActivity.this, RegisterDevice.class);
startActivity(homepage);
finish();
}
else {
Intent homepage = new Intent(MainActivity.this, LoginActivity.class);
startActivity(homepage);
finish();
}
super.onPostExecute(result);
}
}
}
Login loginTask = new Long(getContext());
loginTask.execute();
public class Login extends AsyncTask<String, Integer, String> {
private Context mContext ;
private ProgressDialog pd;
private Handler handler = new Handler { };
public Login (Context context){
mContext = context ;
}
.....
类登录应该有一个接受上下文的构造函数
示例代码
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_main);
LogIN loginUser = new LogIN();
LoginUser.execute("");
}
private class LogIN extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... sUrl) {
try {
String path = "http://www.domain_name.com/app/checkSession.php";
HttpClient client = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000);
HttpResponse response;
JSONObject json = new JSONObject();
try {
HttpPost post = new HttpPost(path);
json.put("access_token", "123456");
post.setHeader("json", json.toString());
StringEntity se = new StringEntity(json.toString());
se.setContentEncoding((Header) new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(se);
response = client.execute(post);
/* Checking response */
if (response != null) {
InputStream in = response.getEntity().getContent();
String a = convertStreamToString(in);
JSONObject jsono = stringToJsonobj(a);
String passedStringValue = jsono.getString("result");
if(passedStringValue.equals("1")){
flags=1;
//Log.v("TAGG", "Success");
}
else {
flags=0;
//Log.v("TAGG", "Failed !");
}
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialogue("Login Processing", "Loading");
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
}
@Override
protected void onPostExecute(String result) {
if(flags.equals(1)){
Itent homepage = new Intent(MainActivity.this, RegisterDevice.class);
startActivity(homepage);
finish();
}
else {
Intent homepage = new Intent(MainActivity.this, LoginActivity.class);
startActivity(homepage);
finish();
}
super.onPostExecute(result);
}
}
}
Login loginTask = new Long(getContext());
loginTask.execute();
public class Login extends AsyncTask<String, Integer, String> {
private Context mContext ;
private ProgressDialog pd;
private Handler handler = new Handler { };
public Login (Context context){
mContext = context ;
}
.....
公共类登录扩展异步任务{
私有上下文;
私营部门;
私有处理程序