Getting problem when calling the class. I didn’t get solution for my exact problem. Till my work is:
Task.java:
public class Task extends AsyncTask<Void, Void, String>
{
Context context;
FragmentActivity currentActivity;
ProgressDialog dialog;
public Task(FragmentActivity activity)
{
currentActivity = activity;
context=Constant.getContext();
}
@Override
protected void onPreExecute()
{
dialog=ProgressDialog.show(currentActivity, "Please wait...", "Loading...");
}
@Override
protected String doInBackground(Void... params)
{
ActivityWeatherSetting hh = new ActivityWeatherSetting();
hh.initialize();
return "success";
}
@Override
protected void onPostExecute(String params)
{
//asyncclass.dismissProgressDialog();
dialog.dismiss();
}
}
AsyncClass.java:
public abstract class AsyncClass extends Activity
{
protected static final String TAG = AsyncClass.class.getSimpleName();
public ProgressDialog progressDialog;
private boolean destroyed = false;
Context context;
@Override
protected void onDestroy()
{
super.onDestroy();
destroyed = true;
}
public void showLoadingProgressDialog()
{
context=Constant.getContext();
this.showProgressDialog("Loading. Please wait...");
Log.d("this",this.toString());
}
public void showProgressDialog(CharSequence message)
{
if (progressDialog == null)
{
progressDialog = new ProgressDialog(this);
progressDialog.setIndeterminate(true);
}
progressDialog.setMessage(message);
progressDialog.show();
}
public void dismissProgressDialog()
{
if (progressDialog != null && !destroyed)
{
progressDialog.dismiss();
}
}
}
ActivityWeatherSetting.java:
public void initialize()
{
LayoutInflater layout = new LayoutInflater(Constant.getContext()) {
@Override
public LayoutInflater cloneInContext(Context newContext) {
return null;
}
};
view=(View)layout.inflate(R.layout.activity_grid_layout, null);
boolean bResult = initializeData();
if (bResult != false ){
bResult = initializeView();
}
if (bResult == false){
Log.e(TAG,"Init data failed");
return;
}
drawWeatherScreen();
}
private void updateDataOfCurrentLocation(){
requestUpdateWeather();
}
private void requestUpdateWeather(){
Message msgFetchData = new Message();
msgFetchData.what = REG_GET_WEATHER_START;
m_HandleRequest.sendMessage(msgFetchData);
}
private void initializeHandleRequest(){
m_Runnable = new Runnable(){
//@Override
public void run() {
requestUpdateWeather();
}
};
/* Setting up handler for ProgressBar */
m_HandleRequest = new Handler(){
@Override
public void handleMessage(Message message) {
int nRequest = message.what;
switch(nRequest){
case REG_GET_WEATHER_START:
String strWOEID = m_Preferneces.getLocation();
if (strWOEID == null){
Log.e(TAG,"Can not get WOEID");
//m_ProgressDialog.dismiss();
//displayNotifyCation(R.string.strFetchFailed);
return;
} else {
//Get weather information
m_WeatherInfo = m_DataModel.getWeatherData(strWOEID);
}
Message msgRegSearch = new Message();
msgRegSearch.what = REG_GET_WEATHER_FINISH;
sendMessage(msgRegSearch);
break;
case REG_GET_WEATHER_FINISH:
if (m_WeatherInfo != null){
updateWeatherInfo(m_WeatherInfo);
//notifyUpdateTime();
}
//m_ProgressDialog.dismiss();
m_HandleRequest.postDelayed(m_Runnable, (ONE_MINUTE*m_Preferneces.getTimeUpdate()));
break;
default:
Log.e(TAG,"Can not handle this message");
break;
}
}
};
}
private boolean initializeView(){
m_TextLocation = (TextView)view.findViewById(R.id.weatherset_location_txtview);
m_Temperature = (TextView)view.findViewById(R.id.weatherset_temp_txtview);
m_Humimidy = (TextView)view.findViewById(R.id.weatherset_humidity_txtview);
m_Visibility = (TextView)view.findViewById(R.id.weatherset_visibility_txtview);
m_WeatherIcon = (ImageView) view.findViewById(R.id.weather_icon);
m_Date = (TextView)view.findViewById(R.id.dateTime);
if ((m_TextLocation == null) || (m_Temperature == null) ||
(m_Humimidy == null) || (m_WeatherIcon == null) ||
(m_Visibility == null) || (m_Date == null)){
Log.e(TAG,"View init failed");
return false;
}
return true;
}
private boolean initializeData(){
/* Get application context */
Context appContext = view.getContext();
/* Get preference instance */
m_Preferneces = WeatherPreferences.getInstance(appContext);
if (m_Preferneces == null){
Log.e(TAG, "Get preference instance failed, check please");
return false;
}
/* Get instance of data model */
m_DataModel = WeatherDataModel.getInstance();
if (m_DataModel == null){
Log.e(TAG,"Can not get data model");
return false;
}
initializeHandleRequest();
return true;
}
private void drawWeatherScreen(){
/
updateDataOfCurrentLocation();
}
private void updateWeatherInfo(WeatherInfo weatherInfo)
{
try
{
if (weatherInfo == null){
Log.e(TAG,"Weather is null");
return;
}
String strCode = weatherInfo.getCode();
int nCode = getImageByCode(strCode);
m_WeatherIcon.setImageResource(nCode);
boolean bIsC = m_Preferneces.getTempFmt();
String strFmt;
String strTemp = weatherInfo.getTemperature(WeatherInfo.TEMPERATURE_FMT_CELSIUS);
if (bIsC == true){
strFmt = view.getContext().getString(R.string.str_temperature_fmt);
} else {
strFmt = view.getContext().getString(R.string.str_temperature_fmt_f);
strTemp = WeatherDataModel.convertC2F(strTemp);
}
//String strTemperature = String.format(strFmt, strTemp);
strTemperature = String.format(strFmt, strTemp);
m_TextLocation.setText(weatherInfo.getCity());
m_Temperature.setText(strTemperature);
m_Date.setText(weatherInfo.getDate());
TextView humidity=(TextView)view.findViewById(R.id.humidityValue);
TextView visibility=(TextView)view.findViewById(R.id.visiValue);
strFmt = view.getContext().getString(R.string.str_humidity_fmt);
String strHumidity = String.format(strFmt, weatherInfo.getHumidity());
//m_Humimidy.setText(strHumidity);
humidity.setText(strHumidity);
strFmt = view.getContext().getString(R.string.str_visi_fmt);
String strVisi = String.format(strFmt, weatherInfo.getVisibility());
//m_Visibility.setText(strVisi);
visibility.setText(strVisi);
}
catch(Exception e)
{
//Toast.makeText(ActivityWeatherSetting.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
private int getImageByCode(String strCode){
int nImageCode = R.drawable.a0;
if (strCode == null){
Log.e(TAG,"Code is null");
return nImageCode;
}
int nCode = Integer.parseInt(strCode);
int nNumber= YahooWeatherHelper.m_ImageArr.length;
for (int i=0; i < nNumber; i++){
if (nCode == YahooWeatherHelper.m_ImageArr[i][1]){
return YahooWeatherHelper.m_ImageArr[i][0];
}
}
return nImageCode;
}
Exception in LogCat:
11-18 13:38:20.510: E/AndroidRuntime(585): FATAL EXCEPTION: AsyncTask #1
11-18 13:38:20.510: E/AndroidRuntime(585): java.lang.RuntimeException: An error occured while executing doInBackground()
11-18 13:38:20.510: E/AndroidRuntime(585): at android.os.AsyncTask$3.done(AsyncTask.java:278)
11-18 13:38:20.510: E/AndroidRuntime(585): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-18 13:38:20.510: E/AndroidRuntime(585): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-18 13:38:20.510: E/AndroidRuntime(585): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-18 13:38:20.510: E/AndroidRuntime(585): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-18 13:38:20.510: E/AndroidRuntime(585): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
11-18 13:38:20.510: E/AndroidRuntime(585): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-18 13:38:20.510: E/AndroidRuntime(585): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-18 13:38:20.510: E/AndroidRuntime(585): at java.lang.Thread.run(Thread.java:856)
11-18 13:38:20.510: E/AndroidRuntime(585): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
11-18 13:38:20.510: E/AndroidRuntime(585): at android.os.Handler.<init>(Handler.java:121)
11-18 13:38:20.510: E/AndroidRuntime(585): at com.net.elderlyhealth.weather.ActivityWeatherSetting$3.<init>(ActivityWeatherSetting.java:384)
11-18 13:38:20.510: E/AndroidRuntime(585): at com.net.elderlyhealth.weather.ActivityWeatherSetting.initializeHandleRequest(ActivityWeatherSetting.java:384)
11-18 13:38:20.510: E/AndroidRuntime(585): at com.net.elderlyhealth.weather.ActivityWeatherSetting.initializeData(ActivityWeatherSetting.java:561)
11-18 13:38:20.510: E/AndroidRuntime(585): at com.net.elderlyhealth.weather.ActivityWeatherSetting.initialize(ActivityWeatherSetting.java:137)
11-18 13:38:20.510: E/AndroidRuntime(585): at com.net.elderlyhealth.weather.Task.doInBackground(Task.java:44)
11-18 13:38:20.510: E/AndroidRuntime(585): at com.net.elderlyhealth.weather.Task.doInBackground(Task.java:1)
11-18 13:38:20.510: E/AndroidRuntime(585): at android.os.AsyncTask$2.call(AsyncTask.java:264)
11-18 13:38:20.510: E/AndroidRuntime(585): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-18 13:38:20.510: E/AndroidRuntime(585): ... 5 more
11-18 13:38:23.420: I/dalvikvm(585): threadid=3: reacting to signal 3
11-18 13:38:23.561: I/dalvikvm(585): Wrote stack traces to '/data/anr/traces.txt'
11-18 13:38:23.920: I/dalvikvm(585): threadid=3: reacting to signal 3
11-18 13:38:24.032: I/dalvikvm(585): Wrote stack traces to '/data/anr/traces.txt'
11-18 13:38:24.940: E/WindowManager(585): Activity com.net.elderlyhealth.view.ViewPagerFragmentActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4149f628 that was originally added here
11-18 13:38:24.940: E/WindowManager(585): android.view.WindowLeaked: Activity com.net.elderlyhealth.view.ViewPagerFragmentActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4149f628 that was originally added here
11-18 13:38:24.940: E/WindowManager(585): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
11-18 13:38:24.940: E/WindowManager(585): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
11-18 13:38:24.940: E/WindowManager(585): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
11-18 13:38:24.940: E/WindowManager(585): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
11-18 13:38:24.940: E/WindowManager(585): at android.view.Window$LocalWindowManager.addView(Window.java:537)
11-18 13:38:24.940: E/WindowManager(585): at android.app.Dialog.show(Dialog.java:278)
11-18 13:38:24.940: E/WindowManager(585): at android.app.ProgressDialog.show(ProgressDialog.java:116)
11-18 13:38:24.940: E/WindowManager(585): at android.app.ProgressDialog.show(ProgressDialog.java:99)
11-18 13:38:24.940: E/WindowManager(585): at android.app.ProgressDialog.show(ProgressDialog.java:94)
11-18 13:38:24.940: E/WindowManager(585): at com.net.elderlyhealth.view.SampleGridTwoFragment$1.onItemClick(SampleGridTwoFragment.java:119)
11-18 13:38:24.940: E/WindowManager(585): at android.widget.AdapterView.performItemClick(AdapterView.java:292)
11-18 13:38:24.940: E/WindowManager(585): at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
11-18 13:38:24.940: E/WindowManager(585): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
11-18 13:38:24.940: E/WindowManager(585): at android.widget.AbsListView$1.run(AbsListView.java:3168)
11-18 13:38:24.940: E/WindowManager(585): at android.os.Handler.handleCallback(Handler.java:605)
11-18 13:38:24.940: E/WindowManager(585): at android.os.Handler.dispatchMessage(Handler.java:92)
11-18 13:38:24.940: E/WindowManager(585): at android.os.Looper.loop(Looper.java:137)
11-18 13:38:24.940: E/WindowManager(585): at android.app.ActivityThread.main(ActivityThread.java:4424)
11-18 13:38:24.940: E/WindowManager(585): at java.lang.reflect.Method.invokeNative(Native Method)
11-18 13:38:24.940: E/WindowManager(585): at java.lang.reflect.Method.invoke(Method.java:511)
11-18 13:38:24.940: E/WindowManager(585): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-18 13:38:24.940: E/WindowManager(585): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-18 13:38:24.940: E/WindowManager(585): at dalvik.system.NativeStart.main(Native Method)
I saw so many questions in AsyncTask problem in SO, but none of that helps me. I need a help…
The problem is that when you call
hh.initialize(), you are already in the background thread and it is too late to create aHandler. In fact, your code is trying to do a lot of UI stuff from the background thread. You should separate out what actually needs to be done outside of the UI thread into a separate method and only invoke that method fromdoInBackgroundof your AsyncTask.