2

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

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

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

  1. 创建一个 android 类(可以从所有活动中访问)
  2. 只需使用特定服务器制作我们需要的 JSON 字符串(用于服务器中的进程)
  3. 只需将创建的 json 传递给创建的类,然后进行 http 连接)
  4. 处理服务器返回的数据
  5. 将其传递给相应的活动

这样我就可以对所有活动使用相同的功能,并且可以避免重复查询

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

我的代码

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

    }

}

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

4

6 回答 6

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 结果的类中实现接口,并在覆盖的方法中实现你想要的任务结果。您使用它的类将如下所示:

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

   }
}
于 2013-05-13T08:21:35.173 回答
0

您可以这样做,例如为 doInBackground() 方法中的所有内容创建单独的类,并在所有活动中调用它,并将参数传递给

   LogIN loginUser = new LogIN(yourparameter);
    LoginUser.execute("");

并检查 AsyncTask 类构造函数中的参数,如

 public LogIN(Myparameter){
        // Your data
      }
于 2013-05-13T08:23:37.640 回答
0

另一方面,您可以为 android 使用这个出色的框架:android-queryasync API。它允许您从活动执行异步网络任务,并轻松处理您的请求结果。

于 2013-05-13T08:33:24.477 回答
0

您应该使用接口来实现对您的 ui 活动的回调。看看这个线程,它可能有用: android asynctask 发送回调到 ui 你的 asynctask 类应该在一个单独的 java 文件中,具有公共访问权限。

要传递参数,您只需调用一个新的 LogIN 异步任务,如下所示:

new LogIN().execute(urls);

希望它有所帮助:)

于 2013-05-13T08:35:25.263 回答
0

请记住,您永远无法知道 AsyncTask 何时结束。因此,如果您使用它来验证用户,然后执行任务 X、任务 Y 或任务 Z,

那么也许最好创建一个登录助手类

公共类 LoginHelper {

public boolean login(params){
    // Authenticate user and return true if successfull
}

}

然后在您的活动课程中

私有类 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...
    }

}

于 2013-05-13T08:46:28.127 回答
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 以显示进度对话框

注意 您可以添加自定义登录任务行为所需的任何构造函数,例如:传递布尔参数以告知登录任务是可取消的...。

希望对你有所帮助:)

于 2013-05-13T08:49:22.663 回答