将android AsyncTask调用转换为单独的类并从所有活动调用

时间:2013-05-13 08:15:46

标签: android web-services android-layout android-intent

我是Android开发的新手。我的应用程序中有一个AsyncTask函数。从所有活动中调用http请求。现在在每个活动中我使用以下类连接到服务器,在某些活动中我甚至调用了两次!!。

基本上我是一名Web开发人员,在这种情况下,我们使用一个可以从整个应用程序(web)访问的类,并使用common函数来执行相同的活动。唯一的区别是输入和输出将被更改。

我怀疑在这种情况下我可以使用(转换)这个函数或类吗? 我的假设是

  1. 创建一个android类(可以从所有活动中访问)
  2. 只需使用特定服务器(用于服务器中的进程)创建我们需要的JSON字符串
  3. 只需将创建的json传递给创建的类,然后进行http连接)
  4. 处理来自服务器的返回数据
  5. 将其传递给相应的活动
  6. 这样我就可以对所有活动使用相同的功能,我可以避免重复查询

    我可以将此代码转换为这种方式吗?

    我的代码

    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);
            }
    
        }
    
    }
    

    请任何人提供帮助/建议 提前致谢

6 个答案:

答案 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-queryasync 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任务的行为 例如:传递布尔参数以告知登录任务是可取消的....

希望能帮到你:)。