2015-11-07 5 views
0

Я работаю над погодным приложением, использующим Async. Он отлично работает для MainActivity, теперь я пытаюсь разработать виджет для него, но я получаю исключение.Произошла ошибка во время выполнения doInBackground() - Android-виджет

Как и другие ответы на SO, общий консенсус по этой проблеме заключается в том, чтобы прекратить использование нити UI в doInBackground. Поэтому я держал его минимальным.

package ali.projecto; 

import android.app.PendingIntent; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationManager; 
import android.os.AsyncTask; 
import android.widget.RemoteViews; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import java.io.InputStream; 
import java.net.URL; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

public class Widget extends AppWidgetProvider { 
    String xtemp; 
    Location loc; 
    Context context; 
    //======================================= OnUpdate Method 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     try { 
      RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 

      Intent intent = new Intent(context, Widget.class); 
      intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[0]); 
      intent.setAction("update"); 

      PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
      remoteViews.setOnClickPendingIntent(R.id.rButton, pi); 

      new MyAsyncTask2().execute(context); 

      appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    //======================================= OnReceive Method 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     super.onReceive(context, intent); 
     try { 
     if (intent.getAction().equals("update")) { 
      new MyAsyncTask2().execute(); 
     } 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    //======================================= AsyncTask 
    public class MyAsyncTask2 extends AsyncTask<Context, Void, String> { 
     private RemoteViews views; 
     private Context context; 

     @Override 
     protected void onPreExecute() { 
      //getLocation(); 
     } 
     @Override 
     protected String doInBackground(Context... params) { 
      context = params[0]; 
      return loadXML2(); 
     } 
     @Override 
     protected void onPostExecute(String result) { 
      try { 
       AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
       views = new RemoteViews(context.getPackageName(), R.layout.widget); 
       if (result != null && result.length() >= 1) { 
        views.setTextViewText(R.id.widtemp, result); 
       } 
       appWidgetManager.updateAppWidget(new ComponentName(context, Widget.class), views); 
      } catch (Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    } 
    //======================================= Load XML 
    public String loadXML2() { 
     try { 
      //=============================== Getting Data 
      URL xmlUrl = new URL("http://api.openweathermap.org/data/2.5/weather?q=dallas%20ga&units=metric&mode=xml&MYIDGOESHERE&units=metric&mode=xml"); 
      InputStream in = xmlUrl.openStream(); 
      Document doc = parse(in); 
      doc.getDocumentElement().normalize(); 
      //================================ Getting Temperature 
      Node nNode = doc.getElementsByTagName("temperature").item(0); 
      Element eElement = (Element) nNode; 
      double d = Math.round(Double.parseDouble(eElement.getAttribute("value"))); 
      int dx = (int) d; 
      xtemp = Integer.toString(dx) + "°"; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return xtemp; 
    } 
    //======================================= Document Parsing 
    public static Document parse (InputStream is) { 
     Document ret = null; 
     DocumentBuilderFactory domFactory; 
     DocumentBuilder builder; 

     try { 
      domFactory = DocumentBuilderFactory.newInstance(); 
      domFactory.setValidating(false); 
      domFactory.setNamespaceAware(false); 
      builder = domFactory.newDocumentBuilder(); 

      ret = builder.parse(is); 
     } 
     catch (Exception ex) { 
      System.err.println("unable to load XML: " + ex); 
     } 
     return ret; 
    } 
} 

шаги, чтобы произвести эту ошибку:

  1. Создание виджета (он обновляет и показывает температуру просто отлично).
  2. Нажмите на виджет и он перестает работать с этим исключением.

Ошибка:

11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #4 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime: Process: ali.projecto, PID: 2505 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime: java.lang.RuntimeException: An error occured while executing doInBackground() 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at java.lang.Thread.run(Thread.java:818) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime: Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at ali.projecto.Widget$MyAsyncTask2.doInBackground(Widget.java:77) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at ali.projecto.Widget$MyAsyncTask2.doInBackground(Widget.java:67) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
11-06 22:54:09.869 2505-3375/ali.projecto E/AndroidRuntime:  at java.lang.Thread.run(Thread.java:818)  
+1

Вы не передаете 'Context' в новый вызов MyAsyncTask2(). Execute()' inReceive() '. –

+0

Это работает! Спасибо! Как я могу принять ваш ответ, так как вы ответили первым? –

+0

Это круто. Легко исправить. Рад, что вы его работали. –

ответ

1
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 

массив пуст.

Эта линия может быть причина ошибки:

context = params[0];

Решения является передать параметр в асинхронные задачи при выполнении его.

new MyAsyncTask2().execute(my_parameter); 
Смежные вопросы