Java 异步任务与主线程
我写了一个程序,它使用互联网访问并发出https请求。所以我不得不使用AsyncTask来完成请求部分。我的问题是,在我的主要活动中,我有一个函数,在每次https请求后递增一个微调器。在我的backgroundTask(即AsyncTask类)中,我包含了一个名为:Java 异步任务与主线程,java,android,android-activity,android-asynctask,Java,Android,Android Activity,Android Asynctask,我写了一个程序,它使用互联网访问并发出https请求。所以我不得不使用AsyncTask来完成请求部分。我的问题是,在我的主要活动中,我有一个函数,在每次https请求后递增一个微调器。在我的backgroundTask(即AsyncTask类)中,我包含了一个名为:ResultSet的静态整数,它对生成的每个异常进行编号。我只想传递一个值(0/1或true/false),这取决于与主线程的连接是否成功。将要传递的这个值将决定我是否应该增加微调器 以下是我的backgroundTask的OnPo
ResultSet
的静态整数,它对生成的每个异常进行编号。我只想传递一个值(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中变量ResultSet的值传递给主线程中的变量代码
我尝试使用静态方法和getter函数,但失败了。无法传递该值
我甚至尝试将主线程中的变量代码更改为publicstatic,并从backgroundTask传递值,但当backgroundTask被销毁时,值会重置。无法传递该值
任何想法或建议都将不胜感激 你不能移动这个代码吗
if(code == 0) {
meterItemIncrement(meters);
screen.setText("");
}
要在asyncTask中执行onPostExecute方法?请创建接口对象并在构造函数中分配它:
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);
}
创建异步任务的对象时:
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);
成功了!但是我必须将3个对象更改为public static,并将meterItemIncrement()函数更改为public static。使用公共可见性和静态访问是一个好主意吗?我接受了答案!这不是个好主意。我认为最好的方法是将活动中的AsyncTask声明为嵌套的内部类。内部类的一个优点是它们可以访问外部类的属性和方法。这意味着活动内部的内部AsyncTask应该能够访问MeterItemCrement,而该方法不是静态的。如果您确实希望AsyncTask作为非内部类,那么可以创建用于通信的接口。那么如何获取主线程上的值呢?