Java Android-Access Servlet AsyncPost来自其他类的任务响应
我有一个应用程序通过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
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();
}
};