【问题标题】:AsyncTask vs MainThreadAsyncTask 与 MainThread
【发布时间】:2020-06-10 04:03:13
【问题描述】:

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

这是我的 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?​​p>

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

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

【问题讨论】:

    标签: java android android-activity android-asynctask


    【解决方案1】:

    你不能移动这段代码

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

    到 onPostExecute 方法?

    【讨论】:

    • 成功了!但我不得不将 3 个对象更改为公共静态以及将meterItemIncrement() 函数更改为公共静态。使用公共可见性和静态访问是个好主意吗?我接受了答案!
    • 这不是一个好主意。我认为最好的方法是将活动中的 AsyncTask 声明为嵌套的内部类。内部类的一个优点是它们可以访问外部类的属性和方法。这意味着 Activity 中的内部 AsyncTask 应该能够访问meterItemIncrement,而无需该方法是静态的。如果您真的希望 AsyncTask 作为非内部类,您可以创建通信接口。
    【解决方案2】:

    在您的 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);
    

    【讨论】:

    • 直到 onPostExecute() 过程部分我才知道。那么如何获取主线程上的值呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多