java - AsyncTask.execute() 不等待 doInBackground 完成

标签 java android multithreading android-asynctask

我知道这是一个重复的问题,但请稍等。我已经阅读了一些类似的问题和答案,但它们似乎都不适合我。

做什么: 我必须进行搜索,将请求发送到 Web 服务并接收响应。 由于我无法在 UI 线程上使用网络,因此我使用了 AsyncTask

我试过的: 我尝试使用 task.execute() 这会立即返回,甚至不显示进度对话框,我收到的响应为 null(在 onPostExecute 中设置)

如果我使用 task.execute.get() 然后它卡住屏幕并且再次没有对话框显示(但我收到正确的响应)。

下面是我的 task.execute 代码。请指正。

public class LookIn extends AppCompatActivity implements View.OnClickListener{
private Button btn=null;
private TextView txtPinCode=null;
private Service service=null;
private final static  int timeout=20;
private String jsonResponse;
//private ProgressBar helperSearchProgressBar;
private String pincode="";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_look_in);
    btn=(Button)findViewById(R.id.button);
    btn.setOnClickListener(this);
    txtPinCode=(TextView) findViewById(R.id.txtPinCode);
    this.service=(Service) ParamFactory.getParam(ConstantLabels.SELECTED_SERVICE_ID);
   // this.helperSearchProgressBar=(ProgressBar)findViewById(R.id.helperSearchProgressBar);
}


@Override
public void onClick(View v) {

    String pincode= txtPinCode.getText().toString();
    if(pincode==null || pincode.isEmpty() || pincode.length()!=6)
    {
        this.txtPinCode.setError("Please enter a 6 degit pin code from 700000 to 700200");

        return;
    }

    ParamFactory.setParam(ConstantLabels.PINCODE_ID,pincode);
    this.pincode=pincode;
    loadHelper();

    Intent intent= new Intent(LookIn.this,SearchResult.class);
    startActivity(intent);
}


public void setJsonResponse(String jsonResponse)
{
    this.jsonResponse=jsonResponse;
}
private void loadHelper()
{

    Log.v("Callme", "Running thread:" + Thread.currentThread().getId());
    ArrayAdapter<User> adapter=null;
    String params=this.pincode+","+this.service.getId();
    List<User> result=null;
    try {
        new CallmeGetHelperAsyncTask().execute(params); //my task.execute()
        result= RestUtil.getUserList(jsonResponse);
        adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, result);
        ParamFactory.setParam("getHelperForService", adapter);
    }
    catch(JSONException x)
    {
        Log.e("Callme", Log.getStackTraceString(x));
    }

}
class CallmeGetHelperAsyncTask extends AsyncTask<String,Void,String > {
   // private Context context=null;
    private ProgressDialog dialog=null;
    private String jsonResponse;
    private LookIn activity;
    public CallmeGetHelperAsyncTask(){}
    public CallmeGetHelperAsyncTask(LookIn activity)
    {
        this.activity=activity;
    }
    @Override
    protected void onPreExecute() {
       this.dialog= new ProgressDialog(LookIn.this);
        this.dialog.setMessage("Loading...");
        this.dialog.show();
        Log.v("Callme","Dialog Shown");
    }

    @Override
    protected void onPostExecute(String s) {
        if(s!=null)
        {
            this.activity.setJsonResponse(s);
        }
        else
        {
            Log.v("Callme","kill me");
        }
        if(this.dialog.isShowing())
        {
            Log.v("Callme","Closing Dialog");
            this.dialog.dismiss();
        }

    }

    @Override
    protected String doInBackground(String... params) {
        Log.v("Callme","From Background:"+Thread.currentThread().getId());
        String pincode=params.clone()[0].split(",")[0];
        String serviceId=params.clone()[0].split(",")[1];
        String url=String.format(URL.GET_HELPER,serviceId,pincode);
        jsonResponse= null;
        try {
            jsonResponse = RestUtil.makeRestRequest(url);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonResponse;
    }
}

}

注意:我还没有尝试使用 while 循环来等待异步任务,因为我认为这最终也会卡住我的屏幕。如果我错了请指正

最佳答案

I haven't tried using while loop to waiting for the asynctask

无需使用循环等待 AsyncTask 结果。

因为 onPostExecute 方法在 doInBackground 之后执行,所以不是在调用 execute 方法之后使用 jsonResponse,而是执行它在 setJsonResponse 方法中,因为此方法从始终在主 UI 线程上运行的 onPostExecute 调用:

public void setJsonResponse(String jsonResponse)
{
    this.jsonResponse=jsonResponse;
    //Create adapter object here
    result= RestUtil.getUserList(jsonResponse);
    adapter = new ArrayAdapter(...);
    ParamFactory.setParam("getHelperForService", adapter);
}

关于java - AsyncTask.execute() 不等待 doInBackground 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35052774/

相关文章:

ios - 分配给每个线程的时间是否相同或有最小时间?

java - Java程序如何知道如何访问该文件?

c# - Java Web 服务客户端未解码 Base64

java - 使用 SSHJ 和 ed25519 进行 SFTP 上传遇到关键问题

Android从数据中获取联系人照片。电子邮件查询

java - android studio 中媒体播放器的问题

java同步: synchronized, wait(),notify()

java - xampp和net beans可以一起用于tomcat吗

android - 类型不匹配。必需 : Nothing Found: Callback<*>

java - 服务器不向连接到它的客户端发送消息