class TestAsync extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
v.findViewById(R.id.loadinglayout).setVisibility(View.VISIBLE);
v.findViewById(R.id.wholecontentlayout).setVisibility(View.INVISIBLE);
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
callAPI();
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
v.findViewById(R.id.loadinglayout).setVisibility(View.INVISIBLE);
v.findViewById(R.id.wholecontentlayout).setVisibility(View.VISIBLE);
}
}
public void callAPI ()
{
RequestInterface requestInterface = new RequestImplementation();
requestInterface.setUrl("https://api.myjson.com/bins/vl9pp");
ConnectionExecutor connectionExecutor = new
ConnectionImplementation();
ResponseInterface temp = null;
try {
temp = connectionExecutor.executeConnection(requestInterface);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
rangeText.setText(temp.getPayload());
}
调用API函数将调用HttpConnection完成的另一个类的方法。
如果函数是从片段中的onViewCreated()
直接调用的,那么它可以工作。如果我从另一个异步任务中调用它,则不返回任何内容。
我实际上是在调用callApi函数时尝试显示进度条。
答案 0 :(得分:0)
在onPostExecute方法
上调用它@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
v.findViewById(R.id.loadinglayout).setVisibility(View.INVISIBLE);
v.findViewById(R.id.wholecontentlayout).setVisibility(View.VISIBLE);
callAPI();
}}
答案 1 :(得分:0)
不允许在UI线程外部启动AsyncTask。 doInBackground
在UI线程之外。
来自https://developer.android.com/reference/android/os/AsyncTask.html:
线程规则
...
必须在UI线程上加载AsyncTask类。
答案 2 :(得分:0)
仅在onProgressUpdate()或onPostExecute()内部,因为这些方法 在UI线程上运行。因此,在UI上启动第二个AsyncTask 选择上面列出的两种方法之一。
简单地说,如果您需要在另一个AsyncTask中启动AsyncTask,则必须从onProgressUpdate()
或onPostExecute()
调用它,因为它们位于UI线程中。
答案 3 :(得分:0)
要显示ProgressBar以使任务正在运行,您应该在onPreExecute()
中显示进度条并将其隐藏在onPostExecute(Result)
中。
AsyncTask<Void, Void, Void> yourTask = new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
/**
* Show your progress bar:
*/
yourProgressBar.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
/**
* Do your stuffs in background thread
*/
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
/**
* Hide your progress bar:
*/
yourProgressBar.setVisibility(View.GONE);
}
};
运行任务:yourTask.execute();
onPostExecute(Result)
方法。