从其他异步任务调用时,异步任务未运行

时间:2017-08-23 10:10:34

标签: java android android-asynctask

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函数时尝试显示进度条。

4 个答案:

答案 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)

从此SO answer

  

仅在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)方法。