【问题标题】:How to execute long job and then update widget from widget onclick method?如何执行长作业,然后从小部件 onclick 方法更新小部件?
【发布时间】:2012-08-21 11:43:34
【问题描述】:

我正在登录银行帐户并获取帐户余额。 我从小部件中的 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 执行此操作吗? 我可以使用参数调用 widget_update (onUpdate) 来识别来自我的 AsyncTask 吗? 请给我一些示例代码(如果必须是广播接收器等添加到清单中的内容)。

我在 onPostExecute 中更新了小部件,但我认为更好的方法是在 ExampleAppWidgetProvider 类中执行此操作?

【问题讨论】:

    标签: android android-intent widget android-asynctask


    【解决方案1】:

    如果您收到此错误

    找不到明确的活动类..

    可能是因为这条线

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

    【讨论】:

    • Context context = MyAsyncTask.this; Type mismatch: cannot convert from MyAsyncTask to Context 我使用的是来自 ExampleAppWidgetProvider 的上下文。 public class MyAsyncTask extends AsyncTask&lt;Object, Void, BGZ&gt; { Context context; @Override protected BGZ doInBackground(Object... params) { this.context = (Context)params[0]; return GetSomething(); }
    • 我更新了答案,我的意思是您需要上下文的活动。
    • 我还更新了我的问题(添加了一些来源),因为我认为我拥有你所说的一切。
    • 异步任务是您从 ExampleAppWidgetProvider 调用的后台线程,并且您再次从该线程调用 ExampleAppWidgetProvider ,这可能是导致错误的原因。而是将结果保存在 postExecute 中并在 ExampleAppWidgetProvider 中使用它
    • 我该怎么做?添加 AsyncTask.Done 之类的事件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2011-12-20
    • 2021-12-12
    相关资源
    最近更新 更多