AsyncTask 与 MainThread

Posted

技术标签:

【中文标题】AsyncTask 与 MainThread【英文标题】:AsyncTask vs 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 被破坏时,值会重置。该值未通过。

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

【问题讨论】:

【参考方案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() 过程部分我才知道。那么如何获取主线程上的值呢?

以上是关于AsyncTask 与 MainThread的主要内容,如果未能解决你的问题,请参考以下文章

返回类型与 Asynctask 不兼容

AsyncTask 与 MainThread

AsyncTask 对比与 Thread+Handler

Android 简单列表与 AsyncTask 替代

AsyncTask使用与源码解析

AsyncTask使用与源码解析