我是Android开发的新手。我的应用程序中有一个AsyncTask函数。从所有活动中调用http请求。现在在每个活动中我使用以下类连接到服务器,在某些活动中我甚至调用了两次!!。
基本上我是一名Web开发人员,在这种情况下,我们使用一个可以从整个应用程序(web)访问的类,并使用common函数来执行相同的活动。唯一的区别是输入和输出将被更改。
我怀疑在这种情况下我可以使用(转换)这个函数或类吗? 我的假设是
这样我就可以对所有活动使用相同的功能,我可以避免重复查询
我可以将此代码转换为这种方式吗?
我的代码
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);
}
}
}
请任何人提供帮助/建议 提前致谢
答案 0 :(得分:2)
将您的班级提取到其他文件并公开
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);
}
}
关于你的另一个问题,我通常有一个接口,如下所示:
public interface ILoginListener {
public void logInSessionCheckListener(SomeNeeded Value);
}
我在我需要postExecute结果的类中实现接口,并且在overriden方法中,您可以根据任务结果获得所需的内容。 您使用它的类看起来像这样:
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
}
}
答案 1 :(得分:0)
你可以为doInBackground()方法中的所有内容创建单独的类,并在所有活动中调用它,并将参数传递给
LogIN loginUser = new LogIN(yourparameter);
LoginUser.execute("");
并检查AsyncTask类构造函数中的参数,如
public LogIN(Myparameter){
// Your data
}
答案 2 :(得分:0)
另一方面,你可以使用这个伟大的框架android:android-query和async API。 它允许您从活动中执行异步网络任务,并轻松处理您的请求结果。
答案 3 :(得分:0)
您应该使用接口来实现对ui活动的回调。 看看这个帖子,它可能很有用: android asynctask sending callbacks to ui 而你的asyntask类应该是一个带有公共访问的独立java文件。
要传递参数,您只需调用一个新的LogIN异步任务,如下所示:
new LogIN().execute(urls);
希望它有所帮助:)
答案 4 :(得分:0)
请记住,您永远不知道AsyncTask何时完成。因此,如果您使用它来验证用户身份,然后执行任务X,任务Y或任务Z,
那么也许最好创建一个Login helper类
public class LoginHelper {
public boolean login(params){
// Authenticate user and return true if successfull
}
}
然后在你的Activity类中
私有类X扩展了AsyncTask {
@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...
}
}
答案 5 :(得分:0)
首先 您必须传递调用异步任务的上下文
示例代码
Login loginTask = new Long(getContext());
loginTask.execute();
你的类Login应该有一个接受Context
的构造函数示例代码
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 ;
}
.....
然后确保在Login类中创建方法showDialog以显示进度对话框
注意强> 您可以添加所需的构造函数来自定义Login任务的行为 例如:传递布尔参数以告知登录任务是可取消的....
希望能帮到你:)。