异步任务与主线程
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);
好吧,我写了一个程序,它使用互联网访问并发出 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);