Java Android-Access Servlet AsyncPost来自其他类的任务响应

Java Android-Access Servlet AsyncPost来自其他类的任务响应,java,android,json,servlets,android-studio,Java,Android,Json,Servlets,Android Studio,我有一个应用程序通过AsyncPost任务连接到JavaServlet后端。该任务向客户端返回一个字符串,表示用Gson序列化的json对象 它几乎可以正常工作,问题是我无法从实例化对ServletPostAsyncTask:ListViewPrenota.class调用的类访问Servlet响应消息。 该项目的结构如下: 在Servlet和客户端中,我创建了两个类,Tour.class和Tours.class来存储我的数据: 旅游班: public class Tour { // some

我有一个应用程序通过AsyncPost任务连接到
JavaServlet后端。该任务向客户端返回一个字符串,表示用
Gson
序列化的json对象

它几乎可以正常工作,问题是我无法从实例化对
ServletPostAsyncTask
ListViewPrenota.class
调用的类访问Servlet响应消息。 该项目的结构如下:

在Servlet和客户端中,我创建了两个类,
Tour.class
Tours.class
来存储我的数据:

旅游班:

public class Tour {
  // some simple int/string/list fields
}
旅游类:

public class Tours {
  private List<Tour> tours;
  // ...
}
现在,从客户端中的
ListViewPrenota.class
调用
ServletPostAsyncTask

ServletPostAsyncTask s = new ServletPostAsyncTask();
s.execute(new Pair<Context, String>(ListViewPrenota.this, "tours"));
Tours ttours = s.tours;
Tour tour = ttours.getTours().get(0);
ServletPostAsyncTasks=new ServletPostAsyncTask();
s、 执行(新对(ListViewPrenota.this,“tours”);
Tours ttours=s.Tours;
Tour-Tour=ttours.getTours().get(0);
问题:我收到一个指向
Tour.getTours().get(0)的
java.lang.NullPointerException

除了
ServletPostAsyncTask
,还有什么原因阻止我从其他类访问新接收的Tours对象


非常感谢

问题是您认为代码是连续运行的,如果您想使用从
AsycTask
返回的内容,您需要在
onPostExecute
中使用它,或者在完成后使用一个回调发送数据

doInBackground(){
//do heavy work
}

onPostExecute(Data data){
//handle data
//send data via interface to activity or class that needs the data
//or just put everything that needs the data in here
}

好的,它起作用了。以下是我能想到的:

回调接口:

interface CallBack {
    void callBackMethod(Tours tours);//do job
}
调用方类:

class ServletPostAsyncTask extends AsyncTask<Pair<Context, String>, Tours, String>{
    private Context context;
    Tours tours;
    public ListViewPrenota listViewPrenota;
    public ServletPostAsyncTask(ListViewPrenota listView){
        this.listViewPrenota = listView;
    }
    @Override
    protected String doInBackground(Pair<Context, String>... params) {
        //communicate with Servlet and get a HttpResponse
    }

    @Override
    protected void onPostExecute(String jsonResponse) {
        tours = (new Gson().fromJson(jsonResponse, Tours.class));

        //the callback starts a thread updating the UI in ListViewPrenota
        listViewPrenota.callBackMethod(tours);
        Toast.makeText(
                context,
                "Connected. \nTours size: "+ tours.getTours().size(),
                Toast.LENGTH_LONG).show();
        }
    }
类ServletPostAsyncTask扩展了AsyncTask{
私人语境;
旅游;
公共ListViewPrenota ListViewPrenota;
公共ServletPostAsyncTask(ListViewPrenota listView){
this.listViewPrenota=listView;
}
@凌驾
受保护字符串DOINBACKGRAND(对…参数){
//与Servlet通信并获取HttpResponse
}
@凌驾
受保护的void onPostExecute(字符串jsonResponse){
tours=(new Gson().fromJson(jsonResponse,tours.class));
//回调将启动一个线程来更新ListViewPrenota中的UI
调用方法(tours);
Toast.makeText(
上下文
已连接。\n路径大小:“+tours.getTours().size(),
Toast.LENGTH_LONG).show();
}
}
ListViewPrenota中回调接口的实现:

public class ListViewPrenota extends FragmentActivity implements CallBack{
    private ProgressDialog m_ProgressDialog = null;
    private Runnable viewOrders;
    private TourAdapter m_adapter;
    ListView listView;
    private ArrayList<Tour> m_tours =null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_view_prenota);

    listView = (ListView) findViewById(R.id.list);
    m_tours = new ArrayList<Tour>();

    m_adapter = new TourAdapter(this, R.layout.list_row, m_tours);
    listView.setAdapter(m_adapter);

    getActionBar().setDisplayHomeAsUpEnabled(true); //pulsante drawer
    getActionBar().setHomeButtonEnabled(true);      //pulsante dietro

    ServletPostAsyncTask spat = new ServletPostAsyncTask(ListViewPrenota.this);
    String status = spat.getStatus().toString();
    spat.execute(new Pair<Context, String>(ListViewPrenota.this,"tours"));
}

public void callBackMethod(final Tours tours){
    System.out.println("I've been called back");
    viewOrders = new Runnable(){
        @Override
        public void run() {
            getOrders(tours);
        }
    };
    Thread thread =  new Thread(null, viewOrders, "MagentoBackground");
    thread.start();
    m_ProgressDialog = ProgressDialog.show(
            ListViewPrenota.this,
            "Please wait...",
            "Retrieving data ...",
            true);
}

public void getOrders(Tours tours){
    try{
        m_tours = new ArrayList<>();
        m_tours.addAll(tours.getTours());

        Thread.sleep(2000);
        Log.i("ARRAY", "" + m_tours.size());
    } catch (Exception e) {
        Log.e("BACKGROUND_PROC", e.getMessage());
    }
    //add tours to the adapter
    runOnUiThread(returnRes);
}
private Runnable returnRes = new Runnable() {
    @Override
    public void run() {

        if(m_tours != null && m_tours.size() > 0){
            m_adapter.notifyDataSetChanged();
            for(int i=0;i<m_tours.size();i++)
                m_adapter.add(m_tours.get(i));
        }
        m_ProgressDialog.dismiss();
        m_adapter.notifyDataSetChanged();
    }
};
公共类ListViewPrenota扩展碎片活动实现回调{
private ProgressDialog m_ProgressDialog=null;
私人可运行视图命令;
专用TourAdapter m_adapter;
列表视图列表视图;
private ArrayList m_tours=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u list\u view\u prenota);
listView=(listView)findViewById(R.id.list);
m_tours=新的ArrayList();
m_adapter=新TourAdapter(此,R.layout.list_行,m_tours);
setAdapter(m_adapter);
getActionBar().setDisplayHomeAsUpEnabled(true);//脉动抽屉
getActionBar().setHomeButtonEnabled(true);//pulsante dietro
ServletPostAsyncTask spat=新的ServletPostAsyncTask(ListViewPrenota.this);
字符串状态=spat.getStatus().toString();
spat.execute(新对(ListViewPrenota.this,“tours”);
}
公共无效回拨方法(最终巡演){
System.out.println(“我被召回”);
viewOrders=new Runnable(){
@凌驾
公开募捐{
获取订单(旅游);
}
};
线程线程=新线程(null,viewOrders,“MagentoBackground”);
thread.start();
m_ProgressDialog=ProgressDialog.show(
ListViewPrenota.this,
“请等一下……”,
“正在检索数据…”,
正确的);
}
公共秩序(旅游){
试一试{
m_tours=新的ArrayList();
m_tours.addAll(tours.getTours());
《睡眠》(2000年);
Log.i(“数组”,“m_tours.size());
}捕获(例外e){
Log.e(“BACKGROUND_PROC”,e.getMessage());
}
//将巡更添加到适配器
runOnUiThread(returnRes);
}
private Runnable returnRes=new Runnable(){
@凌驾
公开募捐{
if(m_tours!=null&&m_tours.size()>0){
m_adapter.notifyDataSetChanged();

对于(int i=0;听着,但是,我在
onPostExecute
中填充我的Tours Tours对象,这与您的意思有什么不同?回调指的是getter吗?我也尝试过,但没有成功…此外,如果代码不是串行运行的,我如何知道异步任务何时完成并可以发送数据?您的
Tours Tours=s.t我们的;
不会在您的
onPostExecute
点击时填充。调用
execute
后,所有的代码都会立即运行,它不会等待。他们的方法是在onPostExecuteOk中做您需要做的事情,但我明白了您所说的,并且我已经在
onPostExecute
中做了我需要做的事情:它实际上填充了我的任务ject,问题是它按照您的建议做得太晚了。我如何同步整个过程?或者您的意思是不可能将对象从异步任务传递到其他类?更正您不能直接从异步任务传递对象,您需要在发送对象到接口回调
public class ListViewPrenota extends FragmentActivity implements CallBack{
    private ProgressDialog m_ProgressDialog = null;
    private Runnable viewOrders;
    private TourAdapter m_adapter;
    ListView listView;
    private ArrayList<Tour> m_tours =null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_view_prenota);

    listView = (ListView) findViewById(R.id.list);
    m_tours = new ArrayList<Tour>();

    m_adapter = new TourAdapter(this, R.layout.list_row, m_tours);
    listView.setAdapter(m_adapter);

    getActionBar().setDisplayHomeAsUpEnabled(true); //pulsante drawer
    getActionBar().setHomeButtonEnabled(true);      //pulsante dietro

    ServletPostAsyncTask spat = new ServletPostAsyncTask(ListViewPrenota.this);
    String status = spat.getStatus().toString();
    spat.execute(new Pair<Context, String>(ListViewPrenota.this,"tours"));
}

public void callBackMethod(final Tours tours){
    System.out.println("I've been called back");
    viewOrders = new Runnable(){
        @Override
        public void run() {
            getOrders(tours);
        }
    };
    Thread thread =  new Thread(null, viewOrders, "MagentoBackground");
    thread.start();
    m_ProgressDialog = ProgressDialog.show(
            ListViewPrenota.this,
            "Please wait...",
            "Retrieving data ...",
            true);
}

public void getOrders(Tours tours){
    try{
        m_tours = new ArrayList<>();
        m_tours.addAll(tours.getTours());

        Thread.sleep(2000);
        Log.i("ARRAY", "" + m_tours.size());
    } catch (Exception e) {
        Log.e("BACKGROUND_PROC", e.getMessage());
    }
    //add tours to the adapter
    runOnUiThread(returnRes);
}
private Runnable returnRes = new Runnable() {
    @Override
    public void run() {

        if(m_tours != null && m_tours.size() > 0){
            m_adapter.notifyDataSetChanged();
            for(int i=0;i<m_tours.size();i++)
                m_adapter.add(m_tours.get(i));
        }
        m_ProgressDialog.dismiss();
        m_adapter.notifyDataSetChanged();
    }
};