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的主要内容,如果未能解决你的问题,请参考以下文章