让android AsynTask等待结果

时间:2017-01-24 15:48:21

标签: android web-services android-asynctask

我想实现登录活动。它通过网络服务检查用户是否存在。

        EditText un=(EditText) findViewById(R.id.txtName);
        EditText pass=(EditText) findViewById(R.id.txtPass);
        WS ss=new WS();
        String str=ss.execute("checkLogin",un.getText().toString(),pass.getText().toString()).get();
        Intent in=new Intent(arg0.getContext(), Overview.class);
        in.putExtra("username", str);
        if(str=="No User")
            Toast.makeText(getApplicationContext(), "ss", 300).show();
        else
        {
            startActivity(in);
            finish();
        }

问题出现在" IF"部分。 " STR"完成代码行后的值集。 但我想得到" str"然后检查IF是否运行正确的行动。

3 个答案:

答案 0 :(得分:1)

您需要覆盖onPostExecute方法,请参阅下面的示例

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
  protected Long doInBackground(URL... urls) {
      int count = urls.length;
      long totalSize = 0;
      for (int i = 0; i < count; i++) {
          totalSize += Downloader.downloadFile(urls[i]);
          publishProgress((int) ((i / (float) count) * 100));
      }
      return totalSize;
  }

  protected void onProgressUpdate(Integer... progress) {
      setProgressPercent(progress[0]);
  }

  protected void onPostExecute(Long result) {
      showDialog("Downloaded " + result + " bytes");
  }
}

答案 1 :(得分:0)

异步任务的重点是不要同步阻塞。如果您确实需要同步行为,则有几个选项:

  • 首先不要使用AsyncTask(如果是长时间运行的网络呼叫,可能不是一个好主意)
  • 在AsyncTask在onPostExecute方法中完成后台工作之后放置您想要运行的代码,该方法可以访问从后台方法返回的数据的结果
  • 提供对onPostExecute完成后可以调用的AsyncTask的回调(类似于前一个选项的概念,但对更改更正式且更健壮)

我更喜欢最后一个选项,但它也需要比其他选项更多的开发时间。

不要忘记AsyncTask可以在活动完成并关闭后执行后台工作和/或完成,因此请确保在开始与UI交互之前检查该状态。

答案 2 :(得分:0)

如果您尝试进行网络通话,则不应使用asynctask,而应使用loopj或google的排球库。

Asynctask并不适用于长时间的网络调用,只是说这是asynctask类的一个例子,代码:

    class AsyncTaskExample extends AsyncTask<Void, Integer, String> { 
    private  final String TAG = AsyncTaskExample.class.getName(); 
    protected void onPreExecute(){
    Log.d(TAG, "On preExceute...");
    }

    protected String doInBackground(Void...arg0) {

        Log.d(TAG, "On doInBackground...");

        for(int i = 0; i<5; i++){
            Integer in = new Integer(i);
            publishProgress(i);
        }

        return "You are at PostExecute";}

    protected void onProgressUpdate(Integer...a){
        Log.d(TAG,"You are in progress update ... " + a[0]);
    }

    protected void onPostExecute(String result) {
        Log.d(TAG,result); 
        }
    }

根据需要进行编辑,并在要进行检查时在代码中设置新的, 希望它有所帮助