2017-10-05 75 views
-3

也有類似的問題,但它沒有解決我的問題。我在post執行之前運行doInBackground,我想我沒有在doInBackground做任何UI工作,但仍然在後執行運行之前doInBackground.Below是我的代碼。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

doInBackground您在TaskThread是已。 如果您有權訪問** 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

其工作正常。萬分感謝。 –

相關問題