AsyncTask Android示例

时间:2012-03-12 17:09:40

标签: android android-asynctask

我正在阅读AsyncTask,我尝试了下面的简单程序。但它似乎没有用。我怎样才能使它发挥作用?

public class AsyncTaskActivity extends Activity {

    Button btn;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener((OnClickListener) this);
    }

    public void onClick(View view){
        new LongOperation().execute("");
    }

    private class LongOperation extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            for(int i=0;i<5;i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("Executed");
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
        }

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }
    }
}

我只是想在后台进程中在5秒后更改标签。

这是我的 main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical" >
    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:indeterminate="false"
        android:max="10"
        android:padding="10dip">
    </ProgressBar>
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Progress" >
    </Button>
    <TextView android:id="@+id/output"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Replace"/>
</LinearLayout>

22 个答案:

答案 0 :(得分:734)

我的完整答案是here,但这是一个解释性图片,以补充此页面上的其他答案。对我来说,了解所有变量的去向是最开始的最令人困惑的部分。

enter image description here

答案 1 :(得分:670)

好的,你正试图通过另一个线程访问GUI。这主要是不好的做法。

AsyncTask执行另一个线程内doInBackground()内的所有内容,该线程无权访问您的视图所在的GUI。

preExecute()postExecute()允许您在此新线程中发生繁重操作之前和之后访问GUI,您甚至可以将长操作的结果传递给postExecute()然后显示任何处理结果。

请参阅稍后更新TextView的这些行:

TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed");

将它们放入PostExecute()

然后,在doInBackground完成后,您将看到TextView文本已更新。

编辑:我注意到你的onClick监听器没有检查是否已经选择了哪个View。我发现最简单的方法是通过switch语句。我在下面编辑了一个完整的课程,提出了所有可以避免混淆的建议。

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings.System;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;

public class AsyncTaskActivity extends Activity implements OnClickListener {

    Button btn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button) findViewById(R.id.button1);
        // because we implement OnClickListener we only have to pass "this"
        // (much easier)
        btn.setOnClickListener(this);
    }

    public void onClick(View view) {
        // detect the view that was "clicked"
        switch (view.getId()) {
        case R.id.button1:
            new LongOperation().execute("");
            break;
        }
    }

    private class LongOperation extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.interrupted();
                }
            }
            return "Executed";
        }

        @Override
        protected void onPostExecute(String result) {
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("Executed"); // txt.setText(result);
            // might want to change "executed" for the returned string passed
            // into onPostExecute() but that is upto you
        }

        @Override
        protected void onPreExecute() {}

        @Override
        protected void onProgressUpdate(Void... values) {}
    }
}

答案 2 :(得分:71)

我确定它正在正常执行,但您正在尝试更改后台线程中的UI元素,而这是不可行的。

按如下方式修改你的电话和AsyncTask:

致电课程

注意:我个人建议在执行AsyncTask线程的地方使用onPostExecute(),而不是在扩展AsyncTask本身的类中。我认为它使代码更容易阅读,特别是如果你需要在多个地方使用AsyncTask处理结果略有不同。

new LongThread()
{
    @Override public void onPostExecute(String result)
    {
        TextView txt = (TextView) findViewById(R.id.output);
        txt.setText(result);
    }
}.execute("");

LongThread类(扩展AsyncTask):

@Override
protected String doInBackground(String... params) {
    for(int i = 0; i < 5; i++) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    return "Executed";
}      

答案 3 :(得分:54)

  

Concept and code here

我创建了一个使用Android的AsyncTask的简单示例。它以onPreExecute(), doInBackground(), publishProgress()开头,最后是onProgressUpdate()

在这个doInBackground()作为后台线程工作,而其他工作在UI线程中。您无法访问doInBackground()中的UI元素。序列与我提到的相同。

但是,如果您需要更新来自doInBackground的任何小部件,则publishProgress可以doInBackground onProgressUpdate来调用class TestAsync extends AsyncTask<Void, Integer, String> { String TAG = getClass().getSimpleName(); protected void onPreExecute (){ super.onPreExecute(); Log.d(TAG + " PreExceute","On pre Exceute......"); } protected String doInBackground(Void...arg0) { Log.d(TAG + " DoINBackGround","On doInBackground..."); for(int i=0; i<10; i++){ Integer in = new Integer(i); publishProgress(i); } return "You are at PostExecute"; } protected void onProgressUpdate(Integer...a){ super.onProgressUpdate(a); Log.d(TAG + " onProgressUpdate", "You are in progress update ... " + a[0]); } protected void onPostExecute(String result) { super.onPostExecute(result); Log.d(TAG + " onPostExecute", "" + result); } } 来更新您的UI小部件。

new TestAsync().execute();

在您的活动中将其称为:

{{1}}

Developer Reference Here

答案 4 :(得分:15)

移动这两行:

TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed");
从您的AsyncTask的doInBackground方法中取出

并将它们放入onPostExecute方法中。您的AsyncTask应该是这样的:

private class LongOperation extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        try {
            Thread.sleep(5000); // no need for a loop
        } catch (InterruptedException e) {
            Log.e("LongOperation", "Interrupted", e);
            return "Interrupted";
        }
        return "Executed";
    }      

    @Override
    protected void onPostExecute(String result) {               
        TextView txt = (TextView) findViewById(R.id.output);
        txt.setText(result);
    }
}

答案 5 :(得分:10)

执行异步任务时,任务将经历4个步骤:

  1. onPreExecute()
  2. doInBackground(参数...)
  3. onProgressUpdate(进步...)
  4. onPostExecute(结果)
  5. 以下是演示示例

    private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
         protected Long doInBackground(URL... urls) {
             int count = urls.length;
             long totalSize = 0;
             for (int i = 0; i < count; i++) {
                 totalSize += Downloader.downloadFile(urls[i]);
                 publishProgress((int) ((i / (float) count) * 100));
                 // Escape early if cancel() is called
                 if (isCancelled()) break;
             }
             return totalSize;
         }
    
         protected void onProgressUpdate(Integer... progress) {
             setProgressPercent(progress[0]);
         }
    
         protected void onPostExecute(Long result) {
             showDialog("Downloaded " + result + " bytes");
         }
     }
    

    创建后,任务执行非常简单:

     new DownloadFilesTask().execute(url1, url2, url3);
    

    我希望这会对你有帮助......

答案 6 :(得分:10)

以异步方式执行某些操作的最短示例:

class MyAsyncTask extends android.os.AsyncTask {
    @Override
    protected Object doInBackground(Object[] objects) {
        //do something asynchronously
        return null;
    }
}

运行它:

(new MyAsyncTask()).execute();

答案 7 :(得分:10)

背景/理论

AsyncTask 允许您在后台线程上运行任务,同时将结果发布到UI线程。

  

用户应该始终能够与应用互动,因此重要   以避免使用诸如此类的任务阻止主(UI)线程   从网上下载内容。

     

这就是我们使用 AsyncTask

的原因      

它通过包装UI线程消息队列和处理程序提供了一个简单的接口,允许您发送和处理来自其他线程的可运行对象和消息

实施

AsyncTask 是一个通用类。 (它的构造函数需要参数化类型。)

它使用这些三种通用类型:

Params - 执行时发送给任务的参数类型。

Progress - 后台计算期间发布的进度单元的类型。

Result - 后台计算结果的类型。

  

并非所有类型都始终由异步任务使用。要将类型标记为未使用,只需使用类型Void:

     

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

这三个参数对应于您可以在 AsyncTask 中覆盖的三个主要功能

  • doInBackground(Params...)
  • onProgressUpdate(Progress...)
  • onPostExecute(Result)

执行AsyncTask

使用要发送到后台任务的参数调用 execute()

发生了什么

  1. 在主/用户界面上,调用 onPreExecute() 。 (要在此线程中初始化某些内容,例如在用户界面上显示进度条。)

  2. 在后台主题中,调用 doInBackground(Params...) 。 (参数是传递给Execute函数的参数。)

    • 长期任务应该发生的地方

    • 必须至少覆盖doInBackground()才能使用AsyncTask。

    • 在后台计算仍在执行时,调用 publishProgress(Progress...) 更新用户界面中的进度显示。 (例如,为进度条设置动画或在文本字段中显示日志。)

      • 这会导致 onProgressUpdate() 被调用。
  3. 在后台线程中,从doInBackground()返回结果。这将触发下一步。

  4. 在主/用户界面上,使用返回的结果调用 onPostExecute()

  5. 实施例

    再次使用阻止任务的例子来从网上下载内容,

    • 示例A下载图像并将其显示在ImageView
    • 示例B下载一些文件

    示例A

    doInBackground()方法下载图像并将其存储在BitMap类型的对象中。 onPostExecute()方法获取位图并将其放在ImageView中。

    class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        ImageView bitImage;
    
        public DownloadImageTask(ImageView bitImage) {
            this.bitImage = bitImage;
        }
    
        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mBmp = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mBmp = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mBmp;
        }
    
        protected void onPostExecute(Bitmap result) {
            bitImage.setImageBitmap(result);
        }
    }
    

    例B

     private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
         protected Long doInBackground(URL... urls) {
             int count = urls.length;
             long totalSize = 0;
             for (int i = 0; i < count; i++) {
                 totalSize += Downloader.downloadFile(urls[i]);
                 publishProgress((int) ((i / (float) count) * 100));
                 // Escape early if cancel() is called
                 if (isCancelled()) break;
             }
             return totalSize;
         }
    
         protected void onProgressUpdate(Integer... progress) {
             setProgressPercent(progress[0]);
         }
    
         protected void onPostExecute(Long result) {
             showDialog("Downloaded " + result + " bytes");
         }
     }
    

    示例B执行

    new DownloadFilesTask().execute(url1, url2, url3);
    

答案 8 :(得分:6)

当您在工作线程中时,您无法直接操作Android上的UI元素。

当您使用AsyncTask时,请了解回调方法。

例如:

public class MyAyncTask extends AsyncTask<Void, Void, Void>{

    @Override
    protected void onPreExecute() {
        // Here you can show progress bar or something on the similar lines.
        // Since you are in a UI thread here.
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        // After completing execution of given task, control will return here.
        // Hence if you want to populate UI elements with fetched data, do it here.
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
        // You can track you progress update here
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Here you are in the worker thread and you are not allowed to access UI thread from here.
        // Here you can perform network operations or any heavy operations you want.
        return null;
    }
}

供参考: 要从工作线程访问UI线程,可以在视图上使用runOnUiThread()方法或post方法。

例如:

runOnUiThread(new Runnable() {
    textView.setText("something.");
});

or
    yourview.post(new Runnable() {
    yourview.setText("something");
});

这将帮助您更好地了解事情。因此,在您的情况下,您需要在onPostExecute()方法中设置textview。

答案 9 :(得分:6)

如何记住AsyncTask中使用的参数?

  

不要

如果您不熟悉AsyncTask,那么在编写AsyncTask时会感到很困惑。罪魁祸首是AsyncTask中使用的参数,即AsyncTask<A,B,C>。根据方法的 A,B,C(参数)签名而有所不同,这会使事情更加混乱。

保持简单!

关键是不要记住。如果您可以看到任务真正需要执行的操作,那么在第一次尝试时使用正确的签名编写AsyncTask就是小菜一碟。只需弄清楚您的输入,进度和输出是什么,您就可以开始工作了。

那么什么是AsyncTask?

AsyncTask是在后台线程中运行的后台任务。它需要输入,执行进度,并提供输出

  

AsyncTask<Input,Progress,Output>

例如: enter image description here

与方法有什么关系?

  

AsyncTaskdoInBackground()之间

enter image description here

  

doInBackground()onPostExecute(), onProgressUpdate()也是   相关

enter image description here

如何在代码中编写代码?

DownloadTask extends AsyncTask<String,Integer,String>{

  // Always same signature
  @Override
  public void onPreExecute()
  {}

  @Override
  public String doInbackGround(String... params)
  {
           // Download code
           int downloadPerc = // calculate that
           publish(downloadPerc);

           return "Download Success";
  }

  @Override
  public void onPostExecute(String result)
  {
      super.onPostExecute(result);
  }

  @Override
  public void onProgressUpdate(Integer... params)
  {
         // show in spinner, access UI elements
  }

}

您将如何运行此任务?

new DownLoadTask().execute("Paradise.mp3");

答案 10 :(得分:5)

我建议您使用此库进行背景工作,让您的生活更轻松 https://github.com/Arasthel/AsyncJobLibrary

这很简单..

AsyncJob.doInBackground(new AsyncJob.OnBackgroundJob() {

    @Override
    public void doOnBackground() {
        startRecording();
    }
});

答案 11 :(得分:5)

Detailed AsyncTask Explanation tutorial

什么是AsyncTask?

AsyncTask是一个Android类,可帮助我们执行

之类的复杂操作
  1. 网络操作。
  2. 数据库操作。
  3. 存储和读取大型文本文件中的数据。

它减轻了开发人员的紧张情绪

  1. 线程创建和终止。
  2. UI线程同步和管理。

如果您

  1. 不知道您的任务或任务需要花费多长时间
  2. 想执行无限循环工作。

AsyncTask对您而言不是更好的选择。 AsyncTask主要用于短时间操作(最多几秒钟)

如何在您的应用程序中使用AsyncTask?

  1. 创建AsyncTask的子类
  2. 覆盖doInBackground()和其他方法。
  3. 创建AsyncTask子类的实例并调用execute()。

Android AsyncTask Example

AsyncTask使用泛型数据类型

  1. Params -用于启动后台线程执行的数据。
  2. 进度-用于通知任务进度的数据。
  3. 结果-执行后从doInBackground()返回的数据。

AsyncTask帮助我们在其方法内更新UI。

  1. onPreExecute()
  2. onProgressUpdate()
  3. onPostExecute()
  4. onCancelled()

这些方法在主线程上运行。这就是为什么您可以更新UI元素的原因。

doInBackgrund()

中添加困难的任务

并使用 execute()方法调用AsyncTask。

下面的完整详细教程链接

答案 12 :(得分:3)

带有POST请求的示例异步任务:

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("key1", "value1"));
params.add(new BasicNameValuePair("key1", "value2"));
new WEBSERVICEREQUESTOR(URL, params).execute();

class WEBSERVICEREQUESTOR extends AsyncTask<String, Integer, String>
{
    String URL;
    List<NameValuePair> parameters;

    private ProgressDialog pDialog;

    public WEBSERVICEREQUESTOR(String url, List<NameValuePair> params)
    {
        this.URL = url;
        this.parameters = params;
    }

    @Override
    protected void onPreExecute()
    {
        pDialog = new ProgressDialog(LoginActivity.this);
        pDialog.setMessage("Processing Request...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params)
    {
        try
        {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpEntity httpEntity = null;
            HttpResponse httpResponse = null;

            HttpPost httpPost = new HttpPost(URL);

            if (parameters != null)
            {
                httpPost.setEntity(new UrlEncodedFormEntity(parameters));
            }
            httpResponse = httpClient.execute(httpPost);

            httpEntity = httpResponse.getEntity();
            return EntityUtils.toString(httpEntity);

        }  catch (Exception e)
        {

        }
        return "";
    }

    @Override
    protected void onPostExecute(String result)
    {
        pDialog.dismiss();

        try
        {

        }
        catch (Exception e)
        {

        }
        super.onPostExecute(result);
    }
}

答案 13 :(得分:2)

更新:2020年3月

根据Android开发者official documentation,AsyncTask现在已弃用。

建议改用kotlin corourines。简而言之,它允许您以顺序样式编写异步任务。

答案 14 :(得分:1)

简单地:

LongOperation MyTask = new LongOperation();
MyTask.execute();

答案 15 :(得分:1)

 private class AsyncTaskDemo extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Loading...");
        progressDialog.setCancelable(false);
        progressDialog.show();

    }

    @Override
    protected Void doInBackground(Void... arg0) {

        //do code here 

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if (progressDialog.isShowing()) {
            progressDialog.dismiss();
        }

    }

    @Override
    protected void onCancelled() {

        super.onCancelled();
        progressDialog.dismiss();
        Toast toast = Toast.makeText(getActivity(),
                "Error is occured due to some probelm", Toast.LENGTH_LONG);
        toast.setGravity(Gravity.TOP, 25, 400);
        toast.show();

    }

}

答案 16 :(得分:1)

你需要声明按钮onclicklistener,一旦点击它调用AsyncTask类的DownloadJson,过程将如下所示:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btn = (Button) findViewById(R.id.button1);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             new DownloadJson().execute();
            }
        });

    }

     // DownloadJSON AsyncTask
    private class DownloadJson extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected  Void doInBackground(Void... params) {
            newlist = new ArrayList<HashMap<String, String>>();
             json = jsonParser.makeHttpRequest(json, "POST");
            try {
                newarray = new JSONArray(json);
                    for (int i = 0; i < countdisplay; i++) {
                        HashMap<String, String> eachnew = new HashMap<String, String>();
                        newobject = newarray.getJSONObject(i);
                        eachnew.put("id", newobject.getString("ID"));
                        eachnew.put("name", newobject.getString("Name"));
                        newlist.add(eachnew);
                    }
                }
            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void args) {
            newlisttemp.addAll(newlist);
            NewAdapterpager newadapterpager = new NewAdapterpager(ProcesssActivitypager.this,newlisttemp);
            newpager.setAdapter(newadapterpager);
        }
    }

答案 17 :(得分:0)

更改您的代码,如下所示:

@Override
protected void onPostExecute(String result) {

    runOnUiThread(new Runnable() {
        public void run() {
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("Executed");
        }
    });
}

答案 18 :(得分:0)

使用进度示例AsyncTask示例

import android.animation.ObjectAnimator;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class AsyncTaskActivity extends AppCompatActivity implements View.OnClickListener {

    Button btn;
    ProgressBar progressBar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(this);
        progressBar = (ProgressBar)findViewById(R.id.pbar);
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button1:
                new LongOperation().execute("");
                break;
        }
    }

    private class LongOperation extends AsyncTask<String, Integer, String> {

        @Override
        protected String doInBackground(String... params) {
            Log.d("AsyncTask", "doInBackground");
            for (int i = 0; i < 5; i++) {
                try {
                    Log.d("AsyncTask", "task "+(i + 1));
                    publishProgress(i + 1);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.interrupted();
                }
            }
            return "Completed";
        }

        @Override
        protected void onPostExecute(String result) {
            Log.d("AsyncTask", "onPostExecute");
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText(result);
            progressBar.setProgress(0);
        }

        @Override
        protected void onPreExecute() {
            Log.d("AsyncTask", "onPreExecute");
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("onPreExecute");
            progressBar.setMax(500);
            progressBar.setProgress(0);
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            Log.d("AsyncTask", "onProgressUpdate "+values[0]);
            TextView txt = (TextView) findViewById(R.id.output);
            txt.setText("onProgressUpdate "+values[0]);

            ObjectAnimator animation = ObjectAnimator.ofInt(progressBar, "progress", 100 * values[0]);
            animation.setDuration(1000);
            animation.setInterpolator(new LinearInterpolator());
            animation.start();
        }
    }
}

答案 19 :(得分:0)

ASync任务;

public class MainActivity extends AppCompatActivity {

 private String ApiUrl="your_api";

   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     MyTask myTask=new MyTask();
     try {
         String result=myTask.execute(ApiUrl).get();
         Toast.makeText(getApplicationContext(),result,Toast.LENGTH_SHORT).show();
     } catch (ExecutionException e) {
         e.printStackTrace();
     } catch (InterruptedException e) {
        e.printStackTrace();
     }

  }


   public class MyTask extends AsyncTask<String,Void,String>{


    @Override
    protected String doInBackground(String... strings) {
        String result="";
        HttpURLConnection httpURLConnection=null;
        URL url;

        try {
            url=new URL(strings[0]);
            httpURLConnection=(HttpURLConnection) url.openConnection();
            InputStream inputStream=httpURLConnection.getInputStream();
            InputStreamReader reader=new InputStreamReader(inputStream);
            result=getData(reader);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    public String getData(InputStreamReader reader) throws IOException{
        String result="";
        int data=reader.read();
        while (data!=-1){
            char now=(char) data;
            result+=data;
            data=reader.read();
        }
        return result;
    }
  }
}

答案 20 :(得分:0)

在使用AsyncTask时,有必要创建一个类的后继者,并在其中注册我们所需的方法的实现。在本课程中,我们将研究三种方法:

doInBackground -将在新线程中执行,这里我们解决了所有困难的任务。因为非主线程-无法访问UI。

onPreExecute -在doInBackground之前执行,可以访问UI

onPostExecute -在doInBackground之后执行(如果取消了AsyncTask,则不起作用-在下一课中对此进行访问),可以访问UI

此MyAsyncTask类

class MyAsyncTask extends AsyncTask<Void, Void, Void> {

@Override
protected void onPreExecute() {
  super.onPreExecute();
  tvInfo.setText("Start");
}

@Override
protected Void doInBackground(Void... params) {
  //your background method
  return null;
}

@Override
protected void onPostExecute(Void result) {
  super.onPostExecute(result);
  tvInfo.setText("Finish");
}

}

这是调用活动或片段的方法

MyAsyncTask  myAsyncTask = new MyAsyncTask ();
myAsyncTask.execute();

答案 21 :(得分:0)

如果打开AsyncTask类,则可以看到以下代码。

public abstract class AsyncTask<Params, Progress, Result> {
    @WorkerThread
    protected abstract Result doInBackground(Params... params);
    @MainThread
    protected void onPreExecute() {
    }
    @SuppressWarnings({"UnusedDeclaration"})
    @MainThread
    protected void onPostExecute(Result result) {
    }
}

AsyncTask功能

  1. AsyncTask是抽象类
  2. AsyncTask具有3个通用参数。
  3. AsyncTask具有doInBackground,onPreExecute,onPostExecute的抽象方法
  4. doInBackground是WorkerThread(您无法更新UI)
  5. onPreExecute是MainThread
  6. onPostExecute是MainThread(您可以更新UI)

示例

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    mEmailView = (AutoCompleteTextView) findViewById(R.id.email);

    AsyncTask<Void, Void, Post> asyncTask = new AsyncTask<Void, Void, Post>() {
        @Override
        protected Post doInBackground(Void... params) {
            try {
                ApiClient defaultClient = Configuration.getDefaultApiClient();
                String authorization = "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE1ODIxMzM4MTB9.bA3Byc_SuB6jzqUGAY4Pyt4oBNg0VfDRctZ8-PcPlYg"; // String | JWT token for Authorization
                ApiKeyAuth Bearer = (ApiKeyAuth) defaultClient.getAuthentication("Bearer");
                Bearer.setApiKey(authorization);
                PostApi apiInstance = new PostApi();
                String id = "1"; // String | id
                Integer commentPage = 1; // Integer | Page number for Comment
                Integer commentPer = 10; // Integer | Per page number For Comment
                Post result;
                try {
                    result = apiInstance.apiV1PostsIdGet(id, authorization, commentPage, commentPer);
                } catch (ApiException e) {
                    e.printStackTrace();
                    result = new Post();
                }
                return result;
            } catch (Exception e) {
                e.printStackTrace();
                return new Post();
            }
        }

        @Override
        protected void onPostExecute(Post post) {
            super.onPostExecute(post);
            if (post != null) {
                mEmailView.setText(post.getBody());
                System.out.print(post);
            }
        }
    };
    asyncTask.execute();
}