2017-10-05 51 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

其工作正常。万分感谢。 –

相关问题