Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何执行长作业,然后从widget onclick方法更新widget?_Android_Android Intent_Widget_Android Asynctask - Fatal编程技术网

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

Android 如何执行长作业,然后从widget onclick方法更新widget?,android,android-intent,widget,android-asynctask,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 appWidgetMan

我正在登录银行账户,获取账户余额。 我从小部件中的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小部件并输入额外的字符串。 我该怎么做

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);
    }
    (...)
}
package com.example.oobe.widget.widgetexample;
公共类MyAsyncTask扩展了AsyncTask
{
语境;
@凌驾
受保护的BGZ doInBackground(对象…参数)
{
this.context=(context)参数[0];
返回GetSomething();
}
受保护的void onPostExecute(BGZ页)
{
意向意向=新意向(上下文,例如AppWidgetProvider.class);
setAction(AppWidgetManager.ACTION\u APPWIDGET\u UPDATE);
意向。额外(“结果”,结果);
意向书。putExtra(“网页”,网页);
intent.setFlags(intent.FLAG\u活动\u新任务);
背景。开始触觉(意图);
}
(...)
}
如果我像上面那样做,我会得到错误: .. 找不到显式活动类

我可以从AsyncTask执行此操作吗? 我可以用参数调用widget_update(onUpdate)来识别来自异步任务的信息吗? 请给我一些示例代码(如果必须是broadcastreceiver等,那么要向清单添加什么)


我已经在onPostExecute中更新了小部件,但我认为更好的方法是在ExampleAppWidgetProvider类中进行更新,如果您遇到此错误

找不到显式活动类

可能是因为这条线

Intent intent = new Intent(context, ExampleAppWidgetProvider.class); 
确保ExampleAppWidgetProvider.class存在并且

Context context = Activity.this;

更新

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

}
公共类示例AppWidgetProvider扩展AppWidgetProvider
{
//你的代码。。。。。。。
//异步任务作为内部类
公共类MyAsyncTask扩展了AsyncTask
{
doInBackground(){}
onPreExecute(){}
onPostExecute(){
//保存结果
//或者调用异步调用后需要运行的方法
}
}
}

Context Context=MyAsyncTask.this
类型不匹配:无法从MyAsyncTask转换为上下文
我正在使用ExampleAppWidgetProvider中的上下文<代码>公共类MyAsyncTask扩展了AsyncTask{Context Context;@Override protected BGZ doInBackground(Object…params){this.Context=(Context)params[0];return GetSomething();}
我更新了答案,我指的是您需要其上下文的活动。我还更新了我的问题(添加了一些源代码)因为我想我已经掌握了您所说的一切。异步任务是一个后台线程,您正在从ExampleAppWidgetProvider调用它,并且您再次从该线程调用ExampleAppWidgetProvider,这可能是导致错误的原因。相反,请将结果保存在postExecute中,并在ExampleAppWidgetProvider中使用它。我如何做到这一点?添加偶数我不喜欢异步任务。完成了吗?
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
}
}

}