异步任务与主线程

AsyncTask vs MainThread

好吧,我写了一个程序,它使用互联网访问并发出 https 请求。所以我不得不使用 AsyncTask 来完成请求部分。我的问题是,在我的主程序 activity 中,我有一个函数可以在每次发出 https 请求后递增一个微调器。在我的 backgroundTask(即我的 AsyncTask class)中,我包含了一个名为 :resultTest 的静态整数,它为每个生成的异常编号。我只想传递一个值(0/1 或 true/false),具体取决于连接是否成功到我的主线程。将传递的这个值将决定我是否应该增加微调器。

这是我的 backgroundTask 的 OnPostExecute 部分,只是为了让您了解它是如何工作的:

    @Override
protected void onPostExecute(String result) {
    //this method will be running on UI thread

    pdLoading.dismiss();

    if (resultTest == 0) {
        Toast.makeText(ctx,"Successfully Recorded",Toast.LENGTH_LONG).show();
    }
    else{
        String msg = "";
        switch(resultTest){

            case 1:msg = "Internal App Error";
            case 2:msg="Server Problem";
            case 3:msg="Server Returned Error";
            case 4:msg="Connection Problem";
        }

        Toast.makeText(ctx,msg,Toast.LENGTH_LONG).show();
    }

}

这是我在主线程中实例化 BackgroundTask 和取决于返回值的事件的部分:

BackgroundTaskWater backgroundTaskWater = new BackgroundTaskWater(getActivity());
backgroundTaskWater.execute(field, val);

// FIX THIS INCREMENT

if(code == 0) {
  meterItemIncrement(meters);
  screen.setText("");
}

如何将backgroundTask中的变量resultTest的值传递给主线程中的变量code?

我试过使用静态方法和getter函数但失败了。该值未被传递 我什至尝试将主线程中的变量代码更改为 public static 并从 backgroundTask 传递值,但是当 backgroundTask 被销毁时,该值会重置。该值未通过。

任何想法或建议将不胜感激!!

你不能移动这个代码

if(code == 0) {
  meterItemIncrement(meters);
  screen.setText("");
}

到onPostExecute方法?

在您的 asyncTask 中创建接口对象并在构造函数中分配它:

private OnResultCallBack onResultCallBack;

public BackgroundTaskWater (Context mContext, OnResultCallBack onResultCallBack) {
        this.mContext = mContext;
        this.onResultCallBack= onResultCallBack;
    }

现在,在 onPostExecute() 过程中,如果成功与否,您将发送消息并将其作为参数传递到接口中:

if (this.onResultCallBack != null) {
this.onResultCallBack.onSuccess(msg);
}

注意:您还必须创建一个带有您想要的参数的接口,结果如下:

   public interface OnResultCallBack{
    void onSuccess(String msg);
}

在创建您的 asyncTask 对象时:

BackgroundTaskWater backgroundTaskWater = new BackgroundTaskWater(getActivity(), new OnResultCallback() {
            @Override
            public void onSuccess(String msg) {
                // HERE YOU WILL GET YOU MESSAGE!! (AS IN MAIN THREAD)
                // IF YOU WANT STATUS CODE HERE, ADD SECOND PARAMETER IN interface  
            }
        });
backgroundTaskWater.execute(field, val);