如何执行长作业,然后从widget onclick方法更新小部件?

时间:2012-08-21 11:43:34

标签: android android-intent widget android-asynctask

我正在登录银行帐户并获取帐户余额。 我从小部件中的onUpdate调用此函数并在AsyncTask中运行

package com.example.oobe.widget.widgetexample;
public class ExampleAppWidgetProvider extends AppWidgetProvider 
{
    (...)

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[]  appWidgetIds) 
    {
        (...)
        if (notFromAsyncTask)
            new MyAsyncTask().execute(context);
        (...)
    }
    (...)
}

在onPostExecute方法中,我想调用onUpdate小部件和putExtra字符串。 我怎么能这样做?

package com.example.oobe.widget.widgetexample;
public class MyAsyncTask extends AsyncTask<Object, Void, BGZ> 
{
    Context context;

    @Override
    protected BGZ doInBackground(Object... params) 
    {
        this.context = (Context)params[0];
        return GetSomething();
    }

    protected void onPostExecute(BGZ page)
    {
        Intent intent = new Intent(context, ExampleAppWidgetProvider.class);
        intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        intent.putExtra("result", result);
        intent.putExtra("webpage", webPage);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
    (...)
}

如果我这样做,我会收到错误: ..无法找到明确的活动类..

我可以从AsyncTask执行此操作吗? 我可以用params调用widget_update(onUpdate)来识别来自我的AsyncTask吗? 请给我一些示例代码(如果必须是广播接收器,则添加到清单中的内容等等)。

我在onPostExecute中更新了widget,但我认为更好的方法是在ExampleAppWidgetProvider类中做到这一点?

1 个答案:

答案 0 :(得分:0)

如果您收到此错误

  

无法找到明确的活动类..

可能是由于这一行

Intent intent = new Intent(context, ExampleAppWidgetProvider.class); 

确保ExampleAppWidgetProvider.class存在且

Context context = Activity.this;

Intent intent = new Intent(Activity.this, ExampleAppWidgetProvider.class); 

<强>更新

public class ExampleAppWidgetProvider extends AppWidgetProvider 
{

   //your code .......
//asynctask as an inner class
   public class MyAsyncTask extends AsyncTask<Object, Void, BGZ> 
{
  doInBackground(){}
onPreExecute(){}
onPostExecute(){

//save result 
// or call your methods you need to run after your async call
}
}

}