Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在onPostExecute中设置活动的实例变量?_Android_Android Activity_Android Asynctask_Environment Variables_Instance Variables - Fatal编程技术网

Android 如何在onPostExecute中设置活动的实例变量?

Android 如何在onPostExecute中设置活动的实例变量?,android,android-activity,android-asynctask,environment-variables,instance-variables,Android,Android Activity,Android Asynctask,Environment Variables,Instance Variables,我的activity类中有一个AsyncTask,当我检查doInBackground()中的一些数据时,我只想更改/设置activity类的一个实例变量,但不知怎的,没有什么变化( 如果变量发生更改,则应启动另一个异步任务 下面是代码: public class LogIn extends Activity { private boolean emailNotAvalaible; private void setemailNotAvalaible(boolean emailNotAvala

我的activity类中有一个AsyncTask,当我检查doInBackground()中的一些数据时,我只想更改/设置activity类的一个实例变量,但不知怎的,没有什么变化( 如果变量发生更改,则应启动另一个异步任务

下面是代码:

public class LogIn extends Activity {

private boolean emailNotAvalaible;

private void setemailNotAvalaible(boolean emailNotAvalaible) {
    this.emailNotAvalaible= emailNotAvalaible;
}

private Button loginBtn;


 @Override
     protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
         setContentView(R.layout.login_activity);


 loginBtn = (Button) findViewById(R.id.login_btn);

       loginBtn.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {

              new Register().execute("");

              if (emailNotAvalaible== true) {

         new Installation().execute("");

          }

            }// end of onClick()
       });// end of setOnClickListener

}// end of onCreate();


    public class Register extends AsyncTask<String,Integer,String>{ 

       @Override
   protected void onPreExecute() {

       ...

       }//end of onPreExecute()

       @Override
   protected String doInBackground(String... params) {

       ArrayList<NameValuePair> postParamsEmail = new ArrayList<NameValuePair>();
       postParamsEmail.add(new BasicNameValuePair("email", email));

         try {

            String emailCheck = executeHttpPost("http://.../doubleEmail.php", postParamsEmail);

    try {

               JSONArray jsonarr = new JSONArray( emailCheck ); 
               String emailAvalaible = jsonarr.getString(0);

            if( emailAvalaible.equals("no") ){ doubleEmail = "no"; }else{ doubleEmail = "yes"; }

     } catch (JSONException e) {
            e.printStackTrace();
     }
     } catch (Exception e1) {
       e1.printStackTrace();
     }

       }

     return "String";

    }// end of doInBackground()

    @Override
    protected void onPostExecute(String result){
        super.onPostExecute(result);

        if (doubleEmail.equals("no")){
             LogIn.this.setEmailNotAvalaible(true);
        }

    }

    }//end of AsyncTask class

    private static HttpClient getHttpClient() {
    if (mHttpClient == null) {
        mHttpClient = new DefaultHttpClient();
        final HttpParams params = mHttpClient.getParams();
        HttpConnectionParams.setConnectionTimeout(params, HTTP_TIMEOUT);
        HttpConnectionParams.setSoTimeout(params, HTTP_TIMEOUT);
        ConnManagerParams.setTimeout(params, HTTP_TIMEOUT);
    }
    return mHttpClient;
    }//end of getHttpClient()

    public static String executeHttpPost(String url, ArrayList<NameValuePair> postParameters) throws Exception {

    BufferedReader in = null;

    try {
        HttpClient client = getHttpClient();
        HttpPost request = new HttpPost(url);
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
        request.setEntity(formEntity);
        HttpResponse response = client.execute(request);
        in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

        StringBuffer sb = new StringBuffer("");
        String line = "";
        String NL = System.getProperty("line.separator");
        while ((line = in.readLine()) != null) {
            sb.append(line + NL);
        }
        in.close();

        String result = sb.toString();
        return result;

    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    }//end of executeHttpPost()

    }//end of activity class
公共类登录扩展活动{
私有布尔值;
私有void setemailNotAvalaible(布尔型emailNotAvalaible){
this.emailNotAvalaible=emailNotAvalaible;
}
私人按钮登录;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.login_活动);
loginBtn=(按钮)findviewbyd(R.id.login\u btn);
loginBtn.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
新寄存器()。执行(“”);
如果(emailNotAvalaible==true){
新安装()。执行(“”);
}
}//onClick()的结尾
});//setOnClickListener的结尾
}//onCreate()的结束;
公共类寄存器扩展异步任务{
@凌驾
受保护的void onPreExecute(){
...
}//onPreExecute()的结束
@凌驾
受保护的字符串doInBackground(字符串…参数){
ArrayList PostParamsMail=新的ArrayList();
postparamesmail.add(新的BasicNameValuePair(“email”,email));
试一试{
字符串emailCheck=executehttpost(“http://.../doubleEmail.php“,后参数邮件);
试一试{
JSONArray jsonarr=新JSONArray(emailCheck);
字符串emailAvailable=jsonarr.getString(0);
如果(emailavailable.equals(“no”){doubleEmail=“no”}其他{doubleEmail=“yes”}
}捕获(JSONException e){
e、 printStackTrace();
}
}捕获(异常e1){
e1.printStackTrace();
}
}
返回“字符串”;
}//doInBackground()的结尾
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
如果(doubleEmail.equals(“否”)){
LogIn.this.setEmailNotavalable(true);
}
}
}//异步任务类的结束
私有静态HttpClient getHttpClient(){
if(mHttpClient==null){
mHttpClient=新的DefaultHttpClient();
最终HttpParams params=mHttpClient.getParams();
setConnectionTimeout(参数,HTTP_超时);
HttpConnectionParams.setSoTimeout(参数,HTTP_超时);
setTimeout(参数,HTTP_超时);
}
返回mHttpClient;
}//getHttpClient()的结尾
公共静态字符串executeHttpPost(字符串url、ArrayList后参数)引发异常{
BufferedReader in=null;
试一试{
HttpClient=getHttpClient();
HttpPost请求=新的HttpPost(url);
UrlEncodedFormEntity formEntity=新的UrlEncodedFormEntity(后参数);
请求。setEntity(formEntity);
HttpResponse response=client.execute(请求);
in=新的BufferedReader(新的InputStreamReader(response.getEntity().getContent());
StringBuffer sb=新的StringBuffer(“”);
字符串行=”;
字符串NL=System.getProperty(“line.separator”);
而((line=in.readLine())!=null){
sb.追加(行+NL);
}
in.close();
字符串结果=sb.toString();
返回结果;
}最后{
if(in!=null){
试一试{
in.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}//ExecuteHttpHost()的结尾
}//活动课结束
有些代码未显示,但此代码对于解决方案并不重要。 php文件只是检查输入的电子邮件是否存在于数据库中。 因此,主要的问题是如何在doInBackground或onPostExecute中轻松更改变量“emailNotAvalaible”

谢谢你的帮助

编辑:


再次您好,感谢everybodys的帮助,更改变量效果很好,但我想我的问题是,在我的Register AsyncTask完成之前,新的AsyncTask会验证变量并希望启动,但在设置变量之后的一秒钟。那么,如何确保第二个AsyncTask仅在第一个Async任务启动时启动任务准备好了吗?谢谢你们的帮助!!!

这不应该是个问题。下面是一个很好的例子:

    public class Register extends AsyncTask<String,Integer,String>{ 

    @Override
    protected void onPreExecute() {

        Log.d("", "on pre bool: " + bool);


    }//end of onPreExecute()

    @Override
    protected String doInBackground(String... params) {
        bool = true;
        return "";
    }

    @Override
    protected void onPostExecute(String result){
        super.onPostExecute(result);
        Log.d("", "on post, bool: " + bool);
    }

}

我猜您的变量doubleEmail没有设置为“否”。

有几种方法,但postExecute方法可以解决您的问题。请看:

因此,我想我至少找到了一种解决问题的方法,这可能不是最好的方法,但效果很好

现在,对于那些对我的解决方案感兴趣的人

我在这里找到了:,多亏了

我选择了“get”选项:
new Register().execute(“”).get(2000,TimeUnit.millises);


如果有更好的解决方案,请告诉我,否则谢谢您的帮助!

您确定doubleEmail.equals(“否”)返回true吗?尝试将EmailAvailable.equals(“否”)替换为true,看看变量是否更改。
 07-19 11:57:25.943: D/(21843): on pre bool: false
 07-19 11:57:29.736: D/(21843): on post, bool: true