আমার কাছে খুব সহজ অ্যাসিঙ্কটাস্ক বাস্তবায়নের উদাহরণ রয়েছে এবং অ্যান্ড্রয়েড জুনিট ফ্রেমওয়ার্ক ব্যবহার করে এটি পরীক্ষা করতে সমস্যা হচ্ছে।
আমি যখন ইনস্টল করে এটি সাধারণ প্রয়োগে কার্যকর করি তখন এটি ঠিক কাজ করে। তবে এটি যখন অ্যান্ড্রয়েড টেস্টিং ফ্রেমওয়ার্ক ক্লাসগুলির কোনও (যেমন অ্যান্ড্রয়েড টেস্টকেস , অ্যাক্টিভিটিউনিটটেষ্টেকেস , অ্যাক্টিভিটিআইনোসেন্টেশনেশন টেস্টক্যাস 2 ইত্যাদি) থেকে কার্যকর করা হয় তখন এটি অদ্ভুতভাবে আচরণ করে:
- এটি
doInBackground()
পদ্ধতিটি সঠিকভাবে কার্যকর করে - তবে এটি তার প্রজ্ঞাপন পদ্ধতি (কোন কিছুকে ডাকে না
onPostExecute()
,onProgressUpdate()
ইত্যাদি) - শুধু চুপটি তাদের কোনো ত্রুটি দেখিয়ে উপেক্ষা করে।
এটি খুব সহজ AsyncTask উদাহরণ:
package kroz.andcookbook.threads.asynctask;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.Toast;
public class AsyncTaskDemo extends AsyncTask<Integer, Integer, String> {
AsyncTaskDemoActivity _parentActivity;
int _counter;
int _maxCount;
public AsyncTaskDemo(AsyncTaskDemoActivity asyncTaskDemoActivity) {
_parentActivity = asyncTaskDemoActivity;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
_parentActivity._progressBar.setVisibility(ProgressBar.VISIBLE);
_parentActivity._progressBar.invalidate();
}
@Override
protected String doInBackground(Integer... params) {
_maxCount = params[0];
for (_counter = 0; _counter <= _maxCount; _counter++) {
try {
Thread.sleep(1000);
publishProgress(_counter);
} catch (InterruptedException e) {
// Ignore
}
}
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int progress = values[0];
String progressStr = "Counting " + progress + " out of " + _maxCount;
_parentActivity._textView.setText(progressStr);
_parentActivity._textView.invalidate();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
_parentActivity._progressBar.setVisibility(ProgressBar.INVISIBLE);
_parentActivity._progressBar.invalidate();
}
@Override
protected void onCancelled() {
super.onCancelled();
_parentActivity._textView.setText("Request to cancel AsyncTask");
}
}
এটি একটি পরীক্ষার মামলা। এখানে AsyncTaskDemoActivity মোডে AsyncTask পরীক্ষার জন্য ইউআই সরবরাহকারী একটি খুব সাধারণ ক্রিয়াকলাপ:
package kroz.andcookbook.test.threads.asynctask;
import java.util.concurrent.ExecutionException;
import kroz.andcookbook.R;
import kroz.andcookbook.threads.asynctask.AsyncTaskDemo;
import kroz.andcookbook.threads.asynctask.AsyncTaskDemoActivity;
import android.content.Intent;
import android.test.ActivityUnitTestCase;
import android.widget.Button;
public class AsyncTaskDemoTest2 extends ActivityUnitTestCase<AsyncTaskDemoActivity> {
AsyncTaskDemo _atask;
private Intent _startIntent;
public AsyncTaskDemoTest2() {
super(AsyncTaskDemoActivity.class);
}
protected void setUp() throws Exception {
super.setUp();
_startIntent = new Intent(Intent.ACTION_MAIN);
}
protected void tearDown() throws Exception {
super.tearDown();
}
public final void testExecute() {
startActivity(_startIntent, null, null);
Button btnStart = (Button) getActivity().findViewById(R.id.Button01);
btnStart.performClick();
assertNotNull(getActivity());
}
}
এই সমস্ত কোডটি ঠিকঠাকভাবে কাজ করছে, অ্যান্ড্রয়েড টেস্টিং ফ্রেমওয়ার্কের মাধ্যমে কার্যকর করা হলে অ্যাসিঙ্কটাস্ক এটির বিজ্ঞপ্তি পদ্ধতিগুলি গ্রহণ করে না except কোন ধারনা?
Service.doSomething()
?