Android 如何执行长作业,然后从widget onclick方法更新widget?
我正在登录银行账户,获取账户余额。 我从小部件中的onUpdate调用此函数,并在AsyncTask中运行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
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
}
}
}