AppWidgetProvider public void onEnabled (Context context) не влияет на виджет
Я использую AppWidgetProvider и пытаюсь переопределить onEnabled, который, как я полагаю, вызывается, когда приложение добавляется пользователем на домашний экран. Мой класс AppWidgetProvider выглядит следующим образом и вызывает асинхронную задачу, которая должна обновить мое текстовое представление:
package com.example.beerportfoliopro;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
/**
* Created by Mike on 12/26/13.
*/
public class HelloWidget extends AppWidgetProvider {
@Override
public void onEnabled(Context context){
//build url for async task
String url = "hiddenURL";
//call async task
new GetRandomBeer(context).execute(url);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
//todo: call update code, which should be the same as onEnabled
}
}
Мой xml-файл виджета, который отображает вид виджета:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/widget_bg_normal"
>
<TextView
android:id="@+id/widget_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="testing 123"
android:layout_gravity="center_horizontal|center"
android:layout_marginTop="5dip"
android:padding="10dip"
android:textColor="@android:color/black"
>
</TextView>
</LinearLayout>
И моя асинхронная задача, которая в конечном итоге проанализирует JSON-файл для добавления в мой виджет, выглядит следующим образом:
public class GetRandomBeer extends AsyncTask
<String, Void, String> {
Context c;
public GetRandomBeer(Context context)
{
c = context;
}
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
return readJSONFeed(arg0[0]);
}
protected void onPostExecute(String result){
Log.d("taste","Inside get taste");
//decode json here
try{
//todo: get all beer data
//todo: set text views with data
TextView breweryTitle = (TextView) ((Activity) c).findViewById(R.id.widget_tv);
breweryTitle.setText("changed in the async task!");
}
catch(Exception e){
}
}
public String readJSONFeed(String URL) {
StringBuilder stringBuilder = new StringBuilder();
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(URL);
try {
HttpResponse response = httpClient.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream inputStream = entity.getContent();
BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
inputStream.close();
} else {
Log.d("JSON", "Failed to download file");
}
} catch (Exception e) {
Log.d("readJSONFeed", e.getLocalizedMessage());
}
return stringBuilder.toString();
}
}
Исходя из моего кода выше, когда пользователь добавляет виджет на домашний экран, он должен запускать onEnabled (), который должен вызвать мою асинхронную задачу и изменить текстовое представление со слова «проверка 123» на «изменение асинхронной задачи!»
Сейчас ничего не меняется, и я не могу понять, почему.
Обновить:
Вот код, который у меня есть в моем манифесте, связанном с моим виджетом:
<receiver android:name="com.example.beerportfoliopro.HelloWidget" android:label="@string/app_name">
<intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
</intent-filter>
Я также знаю, что моя асинхронная задача вызывается, потому что я просто поместил в нее какой-то Log.d, и он выполняет асинхронную задачу, просто не устанавливая значение textview в виджете.
Обновление 2
Я также попытался использовать удаленный просмотр с предложенным ответом ниже, и теперь у меня есть это в моей асинхронной задаче:
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
String beerText = "try number 3";
AppWidgetManager mgr = AppWidgetManager.getInstance(c);
int[] appWidgetIds = mgr.getAppWidgetIds(new ComponentName(c, HelloWidget.class));
//You need a static method somewhere (I usually put in widget provider class)
//that builds the RemoteView and sets everything up.
RemoteViews rv = HelloWidget.buildRemoteViews(c, mgr, appWidgetIds);
rv.setTextViewText(R.id.widget_tv, beerText);
mgr.updateAppWidget(appWidgetIds, rv);
return readJSONFeed(arg0[0]);
}
Но я получаю не могу разрешить ошибку метода
RemoteViews rv = HelloWidget.buildRemoteViews(c, mgr, appWidgetIds);
подbuildRemoteViews