web-dev-qa-db-ja.com

AsyncTask Androidの例

私は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>
613
Fox

さて、あなたは別のスレッドを通してGUIにアクセスしようとしています。これは主に、良い習慣ではありません。 

AsyncTaskは別のスレッドの内側でdoInBackground()内のすべてを実行します。これはあなたのビューがあるところのGUIへのアクセスを持っていません。

preExecute()postExecute()は、この新しいスレッドで重い作業が行われる前後にGUIへのアクセスを提供します。長い操作の結果をpostExecute()に渡して処理結果を表示することもできます。

あなたが後であなたのTextViewを更新しているところでこれらの行を見てください:

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

それらをPostExecute()に入れる

doInBackgroundが完了した後にTextViewテキストが更新されます。

編集: 私はあなたのonClickリスナーがどのビューが選択されているか確認するためにチェックしないことに気づいた。これを行う最も簡単な方法は、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) {}
    }
}
652
Graham Smith

私の全回答は ここ ですが、これはこのページの他の回答を補足するための説明図です。私にとっては、すべての変数がどこに向かっているのかを理解することが最初のうち最も混乱しやすい部分でした。

enter image description here

711
Suragch

きちんと実行されていると確信していますが、バックグラウンドスレッドでUI要素を変更しようとしているので変更できません。

次のように通話とAsyncTaskを修正します。

呼び出しクラス

注: / AsyncTaskスレッド自体を拡張するクラスではなく、AsyncTaskスレッドを実行するときはいつでもonPostExecute()を使用することをお勧めします。特に、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";
}      
69
bbedward

概念とコードはここ

AndroidのAsyncTaskを使用するための簡単な例を作成しました。それはonPreExecute(), doInBackground(), publishProgress()で始まり、最後にonProgressUpdate()です。

この場合、doInBackground()はバックグラウンドスレッドとして機能し、他のUIスレッドでは機能します。 doInBackground()でUI要素にアクセスすることはできません。シーケンスは私が述べたのと同じです。

ただし、doInBackgroundからウィジェットを更新する必要がある場合は、publishProgressからdoInBackgroundを呼び出して、UIウィジェットを更新するために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);
    }
}

あなたの活動の中でこのように呼ぶ:

new TestAsync().execute();

開発者リファレンスはこちら

53
nitesh

次の2行を移動してください。

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);
    }
}
15
Ted Hopp

非同期タスクが実行されると、タスクは4つのステップを経ます。

  1. onPreExecute()
  2. doInBackground(Params ...)
  3. onProgressUpdate(進捗状況...)
  4. onPostExecute(結果)

以下はデモの例です

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);

私はこれがあなたを助けることを願っています...

10
Ganesh Katikar

背景/理論

AsyncTaskを使用すると、結果をUIスレッドに公開しながら、バックグラウンドスレッドでタスクを実行できます。

ユーザーはいつでもアプリと対話できるので、[(____)]ダウンロードなどのタスクでimportantメイン(UI)スレッドをブロックしないように Webからのコンテンツ。

これが私たちがAsyncTaskを使う理由です。

それは あなたが他のスレッドから実行可能なオブジェクトとメッセージを送って処理することを可能にするUIスレッドメッセージキューとハンドラをラッピングする による直接的なインターフェースを提供します。

実装

AsyncTaskはジェネリッククラスです。 (コンストラクタにパラメータ化された型を取ります。)

それはこれらの3つの一般的な型:を使います 

Params - 実行時にタスクに送信されるパラメータの型.

Progress - バックグラウンド計算中に発行されたプログレスユニットのタイプ。

Result - バックグラウンド計算の結果の型.

すべての型が常に非同期タスクによって使用されるわけではありません。タイプを未使用としてマークするには、単にタイプVoidを使用します。

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

これらの3つのパラメータ3つの主要関数に対応あなたはAsyncTaskで上書きすることができます:

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

AsyncTaskを実行する

バックグラウンドタスクに送信するパラメータを指定してexecute()を呼び出します。

何が起こるのですか

  1. メイン/ UIスレッドでは、onPreExecute()が呼び出されます。 (ユーザーインターフェイスにプログレスバーを表示するなど、このスレッドで何かを初期化するため)

  2. バックグラウンドスレッドでは、doInBackground(Params...)が呼び出されます。 (パラメータはExecute関数に渡されるものです。)

    • 長期実行タスクが発生する場所

    • AsyncTaskを使用するには、少なくともdoInBackground()をオーバーライドする必要があります。

    • バックグラウンド計算がまだ実行されている間にpublishProgress(Progress...)を呼び出して、ユーザーインターフェイスの進行状況の表示を更新します。 (例:プログレスバーをアニメートしたり、テキストフィールドにログを表示したりします。)

      • これにより、onProgressUpdate()が呼び出されます。
  3. バックグラウンドスレッドでは、結果はdoInBackground()から返されます。これで次のステップが始まります。

  4. メイン/ UIスレッドで、返された結果を使ってonPostExecute()が呼び出されました。

ブロッキングタスクの例をもう一度使用して、Webから何かをダウンロードします。

  • 例Aは画像をダウンロードしますそしてそれをImageViewに表示します、
  • while 例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);
10
TT--

非同期的に何かをするための最短の例:

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

実行するには

(new MyAsyncTask()).execute();
10
Oded Breiner

ワーカースレッドにいるときは、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;
    }
}

FYI:ワーカースレッドからUIスレッドにアクセスするには、runOnUiThread()メソッドかpostメソッドをビューに使用します。

例えば:

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

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

これはあなたが物事をよりよく知るのに役立ちます。したがって、あなたの場合、あなたはonPostExecute()メソッドであなたのtextviewを設定する必要があります。

6
Krishna

AsyncTaskで使用されるパラメータを記憶する方法

しないで 

あなたがAsyncTaskに不慣れならば、AsyncTaskを書いている間混乱するのは非常に一般的です。主な原因は、AsyncTaskで使用されるパラメータ、つまりAsyncTask<A,B,C>です。メソッドの A、B、C(引数) シグネチャに基づいて異なるため、物事はさらに混乱します。 

複雑にしないでおく!

キーは 暗記しないでください 。あなたがあなたのタスクが本当にする必要があることを視覚化することができるならば、最初の試みで正しいシグネチャでAsyncTaskを書くことは簡単なことでしょう。あなたのインプット、進捗状況、アウトプットが何であるかを理解するだけで、うまくいくでしょう。 

だからAsyncTaskは何ですか?

AsyncTaskはバックグラウンドスレッドで実行されるバックグラウンドタスクです。それは 入力 を取り、 Progress を実行し、 Output を与える。

すなわち 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");
5
Rohit Singh

私はこの作品を背景作品に使うことであなたの生活を楽にすることをお勧めします https://github.com/Arasthel/AsyncJobLibrary

これは簡単です..

AsyncJob.doInBackground(new AsyncJob.OnBackgroundJob() {

    @Override
    public void doOnBackground() {
        startRecording();
    }
});
4
kc ochibili

詳細なAsyncTaskの説明のチュートリアル

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はGenericsデータ型を使用します

  1. Params - バックグラウンドスレッドの実行を開始するために使用されるデータ。
  2. 進行状況 - タスクの進行状況を通知するために使用されるデータ。
  3. 結果 - 実行後にdoInBackground()から返されるデータ。

AsyncTaskは、メソッド内でUIを更新するのに役立ちます。

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

これらのメソッドはメインスレッド上で動作します。それが、UI要素を更新できる理由です。

doInBackgrund() に難しいタスクを追加してください

そして execute() メソッドを使用してAsyncTaskを呼び出します。

以下の詳細なチュートリアルリンク

4
c49

POST requestを使用した非同期タスクの例:

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);
    }
}
3
user1728578

単に:

LongOperation MyTask = new LongOperation();
MyTask.execute();
1
Ebin Sebastian
 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();

    }

}
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);
        }
    }
1

下記のようにコードを変更してください。

@Override
protected void onPostExecute(String result) {

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

AsyncTaskを使用しながら、クラスサクセサを作成し、その中に必要なメソッドの実装を登録する必要があります。このレッスンでは、3つの方法を見ていきます。

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();

進行状況を示すサンプル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();
        }
    }
}
0

非同期タスク。 

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;
    }
  }
}
0