0

Я посмотрел на пару задаваемых вопросов на переполнение стека для отправки INT к моему MainActivity и отображение его на моем TextView. Но пытаться инициализировать активность или контекст не работают .. последняя ошибка, я получаю это:Отправка намерение MainActivity через (С) AsyncTask

FATAL EXCEPTION: AsyncTask #1 Process: com.dahlstore.jsonparsingdemo, PID: 32123 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:309) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.app.Activity.getApplicationContext()' on a null object reference at com.dahlstore.jsonparsingdemo.JSONTask.doInBackground(JSONTask.java:63) at com.dahlstore.jsonparsingdemo.JSONTask.doInBackground(JSONTask.java:21) at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  at java.lang.Thread.run(Thread.java:818)  09-17 18:31:37.015 32123-32152/com.dahlstore.jsonparsingdemo E/Surface: getSlotFromBufferLocked: unknown buffer: 0xabea80a0

Может кто-нибудь объяснить, почему я не могу отправить свое намерение, даже если я использую активность.

/*ROW21*/  public class JSONTask extends AsyncTask<String,String, String>{ 

    OnDataSendToActivity dataSendToActivity; 
    Activity activity; 
    Intent intent; 

    public JSONTask(MainActivity mainActivity) { 
     dataSendToActivity = (OnDataSendToActivity)mainActivity; 
    } 

    public JSONTask(Activity activity){ 
     this.activity = activity; 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     HttpURLConnection connection = null; 
     BufferedReader reader = null; 

     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      InputStream stream = connection.getInputStream(); 

      reader = new BufferedReader(new InputStreamReader(stream)); 
      StringBuffer buffer = new StringBuffer(); 

      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 
      JSONObject parentObject = new JSONObject(buffer.toString()); 
      JSONObject query = parentObject.getJSONObject("query").optJSONObject("results").optJSONObject("channel").optJSONObject("item"); 
      String temperature = query.getJSONObject("condition").optString("temp"); 
      String text = query.getJSONObject("condition").optString("text"); 

      int code = query.getJSONObject("condition").optInt("code"); 
      **//ROW 63** intent = new Intent(activity.getApplicationContext(),MainActivity.class); 

      intent.putExtra("code",code); 

      return temperature + " °C " +" and "+ text; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     activity.startActivity(intent); 
     dataSendToActivity.sendData(result); 
    } 

} 

MainActivity

public class MainActivity extends AppCompatActivity implements OnDataSendToActivity{ 

    public TextView temperatureTextView,textView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     temperatureTextView = (TextView) findViewById(R.id.temperatureTextView); 
     textView = (TextView) findViewById(R.id.textView); 

     new JSONTask(this).execute("https://query.yahooapis.com/v1/public/yql?q=select%20item%20from%20weather.forecast%20where%20woeid%3D906057%20and%20u%3D%27c%27&format=json"); 

     Intent intent = getIntent(); 
     if(intent!= null) { 
      int code = getIntent().getIntExtra("code", 0); 
      String codeToString = String.valueOf(code); 
      textView.setText(codeToString); 
     } else { 
      Toast.makeText(MainActivity.this, "Intent is null", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    public void sendData(String str) { 
     temperatureTextView.setText(str); 
    } 
} 

ОБНОВЛЕНО JSONTASK.JAVA

public class JSONTask extends AsyncTask<String,String, String>{ 
    OnDataSendToActivity dataSendToActivity; 
    Context context; 

    // single constructor to initialize both the context and dataSendToActivity 
    public JSONTask(Context context){ 
     this.context = context; 
     dataSendToActivity = (OnDataSendToActivity) ((Activity) context); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 
     StringBuffer buffer = new StringBuffer(); 

     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 
      InputStream stream = connection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return buffer.toString(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     try { 
      JSONObject parentObject = new JSONObject(result); 
      JSONObject query = parentObject.getJSONObject("query").optJSONObject("results").optJSONObject("channel").optJSONObject("item"); 
      String temperature = query.getJSONObject("condition").optString("temp"); 
      String text = query.getJSONObject("condition").optString("text"); 
      int code = query.getJSONObject("condition").optInt("code"); 
      temperature += " °C " +" and "+ text; 

      Intent intent = new Intent(context, MainActivity.class); 
      intent.putExtra("code", code); 
      context.startActivity(intent); 
      if(dataSendToActivity != null){ 
       dataSendToActivity.sendData(temperature); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

ОБНОВЛЕНО MAINACTIVITY

public class MainActivity extends AppCompatActivity implements OnDataSendToActivity{ 

    public TextView temperatureTextView,textView; 
    Intent intent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     temperatureTextView = (TextView) findViewById(R.id.temperatureTextView); 
     textView = (TextView) findViewById(R.id.textView); 
     intent = getIntent(); 
     new JSONTask(this).execute("https://query.yahooapis.com/v1/public/yql?q=select%20item%20from%20weather.forecast%20where%20woeid%3D906057%20and%20u%3D%27c%27&format=json"); 

    } 


    @Override 
    public void sendData(String str) { 
     temperatureTextView.setText(str); 
    } 
} 
+0

Share все журнала ошибок. –

+0

Я поделился им мистером Агазаде. – user3506

+0

добавить точки останова для 'dataSendToActivity = (OnDataSendToActivity) mainActivity;', 'dataSendToActivity = (OnDataSendToActivity) mainActivity;' и проверить. –

ответ

1

Вы получаете сообщение об ошибке, поскольку ваш номер activity не имеет значения. Это происходит потому, что у вас есть два конструктора.

// this is the constructor that is called 
public JSONTask(MainActivity mainActivity) { 
    dataSendToActivity = (OnDataSendToActivity)mainActivity; 
} 

// this is not called 
public JSONTask(Activity activity){ 
    this.activity = activity; 
} 

Так что ваша переменная activity никогда не инициализируется.

Смотрите мои изменения,

public class JSONTask extends AsyncTask<String,String, String>{ 
    OnDataSendToActivity dataSendToActivity; 
    Context context; 

    // single constructor to initialize both the context and dataSendToActivity 
    public JSONTask(Context context){ 
     this.context = context; 
     dataSendToActivity = (OnDataSendToActivity) ((Activity) context); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 
     StringBuffer buffer = new StringBuffer(); 

     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 
      InputStream stream = connection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return buffer.toString(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     try { 
      JSONObject parentObject = new JSONObject(result); 
      JSONObject query = parentObject.getJSONObject("query").optJSONObject("results").optJSONObject("channel").optJSONObject("item"); 
      String temperature = query.getJSONObject("condition").optString("temp"); 
      String text = query.getJSONObject("condition").optString("text"); 
      int code = query.getJSONObject("condition").optInt("code"); 
      temperature += " °C " +" and "+ text; 

      if(dataSendToActivity != null){ 
       dataSendToActivity.sendData(temperature, code); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

в вашем MainActivity,

public class MainActivity extends AppCompatActivity implements OnDataSendToActivity { 

    public TextView temperatureTextView,textView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     temperatureTextView = (TextView) findViewById(R.id.temperatureTextView); 
     textView = (TextView) findViewById(R.id.textView); 

     new JSONTask(this).execute("https://query.yahooapis.com/v1/public/yql?q=select%20item%20from%20weather.forecast%20where%20woeid%3D906057%20and%20u%3D%27c%27&format=json"); 
    } 

    @Override 
    public void sendData(String str, String code) { 
     temperatureTextView.setText(str); 
     textView.setText(code); 
    } 
} 

Ваш интерфейс OnDataSendToActivity станут,

public interface OnDataSendToActivity { 
    void sendData(String str, String code); 
} 
+0

Благодарю вас, мистер К Нерайдж Лал. К сожалению, у меня все еще есть две ошибки. Первое, что я больше не могу возвращать «температуру +» ° C «+» и «+ текст» в свой метод postExecute, потому что это void.Changing от void до String дает мне «несовместимый тип возврата». Вторая ошибка: активность внутри: Цель намерения = новое намерение (активность, MainActivity.class); не может быть разрешен как символ при использовании приведенного выше кода. Я предполагаю добавить публичный JSONTask (активность активности) { this.activity = activity; } в моем коде? – user3506

+0

Мой плохой. См. Редактирование. Не использовал IDE для написания кода. –

+0

Нет, вам не нужно добавлять этот конструктор. –

0

Я думаю, что ошибка заключается в использовании getIntExtra в Async. Вместо этого используйте putIntExtra для сохранения переменной в намерении.

Путь заключается в сохранении значения, а функции getIntent используются для получения данных из намерения.

Используйте эту линию,

intent = new Intent(getApplicationContext(),MainActivity.class); 

или

intent = new Intent(YourClassName.class,MainActivity.class); 
+0

У меня нет альтернативы putIntExtra. Но я просто изменил на putExtra вместо getIntExtra и обновил сообщение об ошибке. – user3506

+0

@ user3506 Я отредактировал строку в своем ответе. Попробуй. –

+0

К сожалению, все это не сработало. Но спасибо за ваши усилия! – user3506

0

Вы действительно не должны использовать намерение, чтобы отправить "код" в своей деятельности. В doInBackground введите свой «код» в строковую переменную (вам нужно правильно ее разобрать), затем поместите эту строку в качестве аргумента для вашего возвращения.

Затем в postExecute (результат строки) результат переменной должен быть значением, возвращаемым с doInBackground. Теперь dataSendToActivity.sendData (результат) должен работать нормально.

+0

Это очень хорошая идея. Я знаю и успешно отправил «код» через мой метод postExecute. Проблема в том, что функция в моей MainActivity должна работать как индекс, поэтому я могу получить правильное изображение из моей доступной папки. Я не могу вернуть свое значение «code» с помощью dataSendToActivity. Как вы можете видеть, это потому, что я возвращаю две строки прямо сейчас (температура и текст). Intent i = getIntent(); int value = i.getIntExtra ("intVariableName", 0); Drawable weatherIconDrawable = getResources(). GetDrawable (значение); weatherIconImageView.setImageDrawable (weatherIconDrawable); – user3506

+0

Я вижу. вы можете полностью удалить намерение. затем добавьте значение «code» к вашей возвращаемой строке в doInBackground. В postExecute вы можете анализировать значения так, чтобы код шел в textView, а температура переходила к температуре TextView. – user1506104

+1

, и вам нужно проверить комментарий Neeraj, ваша ссылка на работу нуждается в исправлении. – user1506104

Смежные вопросы