「Android/非同期処理/asynctask/基本」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→サンプル) |
(→サンプル) |
||
(同じ利用者による、間の6版が非表示) | |||
行1: | 行1: | ||
+ | 注意:AsyncTaskはAndroid11から非推奨となったので非同期処理は以下推奨。 | ||
+ | |||
+ | [[android/非同期処理/HandlerRunnable]] [ショートカット] | ||
+ | |||
+ | ==asynctaskとは== | ||
バックエンドで同期処理を行う。 | バックエンドで同期処理を行う。 | ||
例えば、ファイルを連続ダウンロードさせて、進捗ダイアログを出すときなどに使う。 | 例えば、ファイルを連続ダウンロードさせて、進捗ダイアログを出すときなどに使う。 | ||
行21: | 行26: | ||
public void onClick(View v) { | public void onClick(View v) { | ||
if (v.getId() == R.id.button1){ | if (v.getId() == R.id.button1){ | ||
− | MyAsyncTask sync = new MyAsyncTask( | + | MyAsyncTask sync = new MyAsyncTask(this); |
− | + | sync.setActivity(this); | |
sync.setHoge("test"); | sync.setHoge("test"); | ||
sync.execute("http://yahoo.co.jp", "http://google.co.jp", "http://www.msn.com"); | sync.execute("http://yahoo.co.jp", "http://google.co.jp", "http://www.msn.com"); | ||
行30: | 行35: | ||
*MyAsyncTask.java | *MyAsyncTask.java | ||
+ | import android.app.Activity; | ||
import android.app.ProgressDialog; | import android.app.ProgressDialog; | ||
import android.content.Context; | import android.content.Context; | ||
行122: | 行128: | ||
==以下エラー対応方法== | ==以下エラー対応方法== | ||
− | android.view.WindowManager$BadTokenException | + | android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? |
− | new MyAsyncTask(this); | + | new MyAsyncTask(this);のところをactivity由来のcontextであるthisで渡せばok。 |
もしくはProgressDialogのところにだけactivityのインスタンスを入れる。 | もしくはProgressDialogのところにだけactivityのインスタンスを入れる。 | ||
+ | |||
+ | 参考:https://qiita.com/le_skamba/items/455d5c37f7a2e853bc67 |
2020年8月13日 (木) 16:03時点における最新版
注意:AsyncTaskはAndroid11から非推奨となったので非同期処理は以下推奨。
android/非同期処理/HandlerRunnable [ショートカット]
asynctaskとは
バックエンドで同期処理を行う。 例えば、ファイルを連続ダウンロードさせて、進捗ダイアログを出すときなどに使う。
サンプル
- AsyncTestActivity.java
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class AsyncTestActivity extends Activity implements OnClickListener { final String TAG = "AsyncTestActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Button)findViewById(R.id.button1)) .setOnClickListener(this); } @Override public void onClick(View v) { if (v.getId() == R.id.button1){ MyAsyncTask sync = new MyAsyncTask(this); sync.setActivity(this); sync.setHoge("test"); sync.execute("http://yahoo.co.jp", "http://google.co.jp", "http://www.msn.com"); } } }
- MyAsyncTask.java
import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.os.AsyncTask; import android.util.Log; public class MyAsyncTask extends AsyncTask<String, Integer, Long> implements OnCancelListener { private final String TAG = "MyAsyncTask"; private ProgressDialog mDialog; private Context mContext; private Activity mActivity; private String hoge; public MyAsyncTask(Context context) { this.mContext = context; } public void setActivity(Activity activity) { mActivity = activity; } public void setHoge(String hoge) { this.hoge = hoge; } @Override protected void onPreExecute() { Log.d(TAG, "onPreExecute"); if (mActivity == null) return; mDialog = new ProgressDialog(mContext); mDialog.setTitle("Please wait"); mDialog.setMessage("Loading data..."); mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mDialog.setCancelable(true); mDialog.setOnCancelListener(this); mDialog.setMax(100); mDialog.setProgress(0); mDialog.show(); } @Override protected Long doInBackground(String... urls) { Log.d(TAG, "hoge" + this.hoge); int count = urls.length; try { for (int i = 0; i < count; i++) { Log.d(TAG, "url=" + urls[i]); if (isCancelled()) break; Thread.sleep(1000); publishProgress((i+1) * 100 / count); } } catch (InterruptedException e) { Log.d(TAG, "InterruptedException in doInBackground"); } return 123L; } @Override protected void onProgressUpdate(Integer... values) { Log.d(TAG, "onProgressUpdate=" + values[0]); if (mDialog == null) return; mDialog.setProgress(values[0]); } @Override protected void onCancelled() { Log.d(TAG, "onCancelled"); if (mDialog == null) return; mDialog.dismiss(); } @Override protected void onPostExecute(Long result) { Log.d(TAG, "onPostExecute=" + result); if (mDialog == null) return; mDialog.dismiss(); } public void onCancel(DialogInterface dialog) { Log.d(TAG, "Dialog onCancell... calling cancel(true)"); this.cancel(true); } }
- res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="text"> </Button> </LinearLayout>
以下エラー対応方法
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
new MyAsyncTask(this);のところをactivity由来のcontextであるthisで渡せばok。
もしくはProgressDialogのところにだけactivityのインスタンスを入れる。