return 对使用 onCreate 的响应以及为什么入队不是异步完成的
return response to use onCreate and why is enqueue not done asynchronously
在将它发送到我的 XMLPullParserHandler 之后是否可以 return peepWithPics,以便我可以调用它 onCreate 并将其设置为 listView 适配器。我不确定如何将它传递给我们的任何其他方法或 class。调用 listViewAdapter 在这种方法中工作,但我无法让 setOnItemClickLIstener 工作,所以想如果我可以在 onCreate 中创建适配器,然后在 setOnItemCLickLister 中创建,应该可以帮助我继续我的开发。
我还读到使用 OkHttp3 进行调用是异步进行的,但我收到错误。
android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触其视图。此错误位于代码行
listView.setAdapter(adapter);
整个方法如
public void getXMLData() {
OkHttpClient client = getUnsafeOkHttpClient();
Request request = new Request.Builder()
.url(myURL)
.build();
client.newCall(request).enqueue(new Callback() {
// android.os.Handler mainHanlder = new android.os.Handler(context.getMainLooper());
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseData = response.body().string();
final InputStream stream = new ByteArrayInputStream(responseData.getBytes());
/*mainHanlder.post(new Runnable() {
@Override
public void run() {*/
ArrayList<PeepWithPic> peepWithPics;
XMLPullParserHandler parserHandler = new XMLPullParserHandler();
peepWithPics = (ArrayList<PeepWithPic>) parserHandler.parse(stream);
/*ListViewAdapter adapter = new ListViewAdapter(getApplicationContext(), peepWithPics);
listView.setAdapter(adapter);
listView.setVisibility(View.VISIBLE);
mProgressBar.setVisibility(View.GONE);*/
/*}
});*/
}
});
}
我试过在 mProgressBar 设置为 gone 后添加。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(getApplicationContext(), "WORKS FROM RUNONUI", Toast.LENGTH_LONG).show();
}
我也在 onCreate 方法中尝试了相同的 setOnItemClickListener
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
context = getApplicationContext();
listView = (ListView) findViewById(R.id.contactListView);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mProgressBar.setVisibility(View.VISIBLE);
getXMLData();
}
在onCreate中调用了getXMLData方法
解决方案应该像使用 Activity 的 runOnUiThread(Runnable) 方法一样简单,我也会创建适配器并在调用 getXMLData() 之前设置它:
将这些添加为您的 Activity
的成员变量
List<PeepWithPic> mPeepWithPics = new ArrayList<PeepWithPic>();
ListViewAdapter mAdapter;
然后在 onCreate() 中初始化您的 Adapter:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
context = getApplicationContext();
listView = (ListView) findViewById(R.id.contactListView);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mProgressBar.setVisibility(View.VISIBLE);
mAdapter = new ListViewAdapter(this, mPeepWithPics);
listView.setAdapter(mAdapter);
/* THIS DOES NOT WORK WHEN YOU HAVE A CLICKABLE VIEW IN A CUSTOM ADAPTER
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(getApplicationContext(), "WORKS FROM RUNONUI", Toast.LENGTH_LONG).show();
}
}); */
getXMLData();
}
然后将您的方法更改为:
public void getXMLData() {
OkHttpClient client = getUnsafeOkHttpClient();
Request request = new Request.Builder()
.url(myURL)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseData = response.body().string();
final InputStream stream = new ByteArrayInputStream(responseData.getBytes());
XMLPullParserHandler parserHandler = new XMLPullParserHandler();
final ArrayList<PeepWithPic> peepWithPics = (ArrayList<PeepWithPic>) parserHandler.parse(stream);
mPeepWithPics.clear();
mPeepWithPics.addAll(peepWithPics);
/* Now tell the adapter on the UI thread its data changed*/
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
listView.setVisibility(View.VISIBLE);
mProgressBar.setVisibility(View.GONE);
}
});
}
});
}
更新
为了处理点击,您必须在根布局的 Adpater 中添加一个 OnItemClickListener,因为您的适配器是自定义的并且视图包含可点击的小部件。
祝你好运,编码愉快!
在将它发送到我的 XMLPullParserHandler 之后是否可以 return peepWithPics,以便我可以调用它 onCreate 并将其设置为 listView 适配器。我不确定如何将它传递给我们的任何其他方法或 class。调用 listViewAdapter 在这种方法中工作,但我无法让 setOnItemClickLIstener 工作,所以想如果我可以在 onCreate 中创建适配器,然后在 setOnItemCLickLister 中创建,应该可以帮助我继续我的开发。
我还读到使用 OkHttp3 进行调用是异步进行的,但我收到错误。
android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触其视图。此错误位于代码行
listView.setAdapter(adapter);
整个方法如
public void getXMLData() {
OkHttpClient client = getUnsafeOkHttpClient();
Request request = new Request.Builder()
.url(myURL)
.build();
client.newCall(request).enqueue(new Callback() {
// android.os.Handler mainHanlder = new android.os.Handler(context.getMainLooper());
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseData = response.body().string();
final InputStream stream = new ByteArrayInputStream(responseData.getBytes());
/*mainHanlder.post(new Runnable() {
@Override
public void run() {*/
ArrayList<PeepWithPic> peepWithPics;
XMLPullParserHandler parserHandler = new XMLPullParserHandler();
peepWithPics = (ArrayList<PeepWithPic>) parserHandler.parse(stream);
/*ListViewAdapter adapter = new ListViewAdapter(getApplicationContext(), peepWithPics);
listView.setAdapter(adapter);
listView.setVisibility(View.VISIBLE);
mProgressBar.setVisibility(View.GONE);*/
/*}
});*/
}
});
}
我试过在 mProgressBar 设置为 gone 后添加。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(getApplicationContext(), "WORKS FROM RUNONUI", Toast.LENGTH_LONG).show();
}
我也在 onCreate 方法中尝试了相同的 setOnItemClickListener
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
context = getApplicationContext();
listView = (ListView) findViewById(R.id.contactListView);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mProgressBar.setVisibility(View.VISIBLE);
getXMLData();
}
在onCreate中调用了getXMLData方法
解决方案应该像使用 Activity 的 runOnUiThread(Runnable) 方法一样简单,我也会创建适配器并在调用 getXMLData() 之前设置它:
将这些添加为您的 Activity
的成员变量List<PeepWithPic> mPeepWithPics = new ArrayList<PeepWithPic>();
ListViewAdapter mAdapter;
然后在 onCreate() 中初始化您的 Adapter:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
context = getApplicationContext();
listView = (ListView) findViewById(R.id.contactListView);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mProgressBar.setVisibility(View.VISIBLE);
mAdapter = new ListViewAdapter(this, mPeepWithPics);
listView.setAdapter(mAdapter);
/* THIS DOES NOT WORK WHEN YOU HAVE A CLICKABLE VIEW IN A CUSTOM ADAPTER
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(getApplicationContext(), "WORKS FROM RUNONUI", Toast.LENGTH_LONG).show();
}
}); */
getXMLData();
}
然后将您的方法更改为:
public void getXMLData() {
OkHttpClient client = getUnsafeOkHttpClient();
Request request = new Request.Builder()
.url(myURL)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseData = response.body().string();
final InputStream stream = new ByteArrayInputStream(responseData.getBytes());
XMLPullParserHandler parserHandler = new XMLPullParserHandler();
final ArrayList<PeepWithPic> peepWithPics = (ArrayList<PeepWithPic>) parserHandler.parse(stream);
mPeepWithPics.clear();
mPeepWithPics.addAll(peepWithPics);
/* Now tell the adapter on the UI thread its data changed*/
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
listView.setVisibility(View.VISIBLE);
mProgressBar.setVisibility(View.GONE);
}
});
}
});
}
更新
为了处理点击,您必须在根布局的 Adpater 中添加一个 OnItemClickListener,因为您的适配器是自定义的并且视图包含可点击的小部件。
祝你好运,编码愉快!