Java 异步任务与主线程

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

我写了一个程序,它使用互联网访问并发出https请求。所以我不得不使用AsyncTask来完成请求部分。我的问题是,在我的主要活动中,我有一个函数,在每次https请求后递增一个微调器。在我的backgroundTask(即AsyncTask类)中,我包含了一个名为:
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作为非内部类,那么可以创建用于通信的接口。那么如何获取主线程上的值呢?