2017-10-05 12 views
-3

このような質問がありますが、私の問題は解決しませんでした。私のポスト実行はdoInBackgroundの前に実行されますが、私はdoInBackgroundで何の仕事もしていないと思いますが、doInBackground.Belowが自分のコードである前に実行後に実行されます。あなたはTaskThreadにすでにいるdoInBackgroundで投稿後にdoInBackgroundが呼び出されます

sumbit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String mail = resMail.getText().toString(); 
      String id = resUniq.getText().toString(); 

      new Reset_Pass_Task().execute(); 

     } 
    }); 
} 

private class Reset_Pass_Task extends AsyncTask<Void,Void,Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 

     try{ 
      ParseQuery<ParseUser> query = ParseUser.getQuery(); 
      query.whereEqualTo("username", "[email protected]"); 
      query.findInBackground(new FindCallback<ParseUser>() { 
       @Override 
       public void done(List<ParseUser> objects, ParseException e) { 

        if (e==null){ 

         for(ParseUser singleobject:objects){ 
          name23 = (String) singleobject.get("uniqueId"); 

         } 
        }else { 
         Log.i("abc",e.toString()); 
        } 
       } 
      }); 
     } catch (Exception e){ 
      Log.i("xys",e.toString()); 
     } 



     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 

     if (name23!=null){ 
      Log.i("def",name23); 
     }else { 
      Log.i("ijk","null"); 
     } 

    } 
} 
+4

query.findInBackground非同期ので、リターンであることは一目瞭然です。 nullがクエリが完了する前に実行される –

+0

任意の提案は、私はnullを返し、次の試行で私の結果を与えると思いません –

+0

だから私はdoInの背景を使用すべきではない? –

答えて

2

。 ** findInBackground **の同期メソッドにアクセスできる場合は、そのメソッドを呼び出します。それ以外の場合は、AsyncTaskを完全に削除してください。findInBackground呼び出しはすでに非同期です。

ここで問題は、doInBackgroundの場合、「可視」と表示されるのは、自動的に返される関数を起動していることです。非同期呼び出しが完了するのを待っているわけではありません。

修正案:

private void resetPassword() { 
try{ 
      ParseQuery<ParseUser> query = ParseUser.getQuery(); 
      query.whereEqualTo("username", "[email protected]"); 
      query.findInBackground(new FindCallback<ParseUser>() { 
       @Override 
       public void done(List<ParseUser> objects, ParseException e) { 

        if (e==null){ 

         for(ParseUser singleobject:objects){ 
          name23 = (String) singleobject.get("uniqueId"); 

         } 
        }else { 
         Log.i("abc",e.toString()); 
        } 
       } 
      }); 
     } catch (Exception e){ 
      Log.i("xys",e.toString()); 
     } 
} 

そして、ちょうどresetPasswordAsync()を呼び出す代わりに新しいReset_Pass_Task()を実行()

+1

'done(...)'がメインのスレッドで実行されているかどうかわからないので、 'runOnUIThread'を'done(...)' – JohnnyAW

+0

良い点@JohnnyAW、しかし、done()メソッド全体は、これまで変数をオーバーライドして他のことをしていない、実際には意味がありません。しかし、あなたが正しいです、もし新しいテキストを取得してそれをTextViewに表示すると、OPは** done()**の実行がUIThreadに戻ることを保証しなければなりません。そうでなければ** runOnUIThread()* * – NSimon

+1

うまく動作します。ありがとう、トン。 –

関連する問題