0

アクティビティ クラスに AsyncTask があり、doInBackground() でいくつかのデータをチェックするときに、アクティビティ クラスのインスタンス変数を変更/設定したいだけですが、どういうわけか何も変更されていません! :( そして、変数が変更された場合、別の AsyncTask が開始されます。

コードは次のとおりです。

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

一部のコードは示されていませんが、このコードはソリューションにとって重要ではありません。php-file は、入力された電子メールがデータベースに存在するかどうかを確認するだけです。それで、主な問題は、doInBackground または onPostExecute で変数「emailNotAvalaible」を簡単に変更するにはどうすればよいかということです。

ご協力いただきありがとうございます!!!

編集:

こんにちは、みんなの助けに感謝します。変数を変更するとうまくいきますが、私の問題は、Register AsyncTask が完了する前に、新しい AsyncTask が変数を証明して開始したいのですが、そのわずか 1 秒後に変数がが設定されています。では、最初の AsyncTask が Allready finished になったときにのみ 2 番目の AsyncTask が開始されるようにするにはどうすればよいでしょうか? 助けてくれてありがとう!!!

4

3 に答える 3

0

したがって、私の問題に対する解決策を少なくとも 1 つ見つけたと思います。これはおそらく最善の解決策ではありませんが、問題なく動作します。

さて、私のソリューションに興味がある人のために。

ここで見つけました:マルチスレッド、 Boris Strandjevのおかげ

「get」オプションを選択しました:new Register().execute("").get(2000, TimeUnit.MILLISECONDS);

より良い解決策があれば教えてください。そうでなければ、私を助けてくれてありがとう!

于 2013-07-21T09:18:10.117 に答える
0

これは問題ではありません。これはうまくいく例です:

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

}

ここで、メイン アクティビティの bool = プライベート ブール値です。ここにlogcatがあります:

 07-19 11:57:25.943: D/(21843): on pre bool: false
 07-19 11:57:29.736: D/(21843): on post, bool: true

私の推測では、あなたの変数 doubleEmail が「no」に設定されていません。

于 2013-07-19T21:58:23.890 に答える
0

いくつかの方法がありますが、postExecute メソッドで問題を解決できます。これを見てください: asynctask onpostexecute メソッドの結果を親アクティビティ android に渡す方法

于 2013-07-19T22:43:51.473 に答える