0

Мой код, вызывающий проблему, находится в главном приложении моего приложения. В методе onCreate существует Thread, который запускает метод, называемый uploadImage(). Затем он возвращает карту и устанавливается в uploadedImage (экземпляр карты). После потока, public Карта uploadedImage имеет значение null. (Он выбрасывает NullPointerExeption на указанной строке). Кто-нибудь знает, почему uploadedImage воспринимается как null за пределами Thread? Благодаря!Почему существует исключение NullPointerException?

... 
public Map uploadedImage; 

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

    //only perform if there is a network connection 
    if(isNetworkAvailable()) { 

     Thread thread = new Thread(new Runnable(){ 
      @Override 
      public void run() { 
       try { 
        //try to upload image 
        uploadedImage = uploadImage(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     thread.start(); 

     TextView txtURL = (TextView) findViewById(R.id.textView); 
     String url = uploadedImage.toString(); //NULLPOINTEREXEPTION HERE 
     txtURL.setText(url); 
    } 
} 
... 
+1

Не эксперт в резьбовой Java, но я предполагаю, что у Thread нет возможности назначить uploadedImage перед тем, как вы его получите. –

+1

ПОТОМУ ЧТО вы делаете это как новую тему. Используйте asynctask, затем поместите их в onPostExecute(). или поместите их в свой поток и вызовите начало с помощью runOnUiThread() <- я не пробовал это до –

+1

То, как вы это делаете сейчас, у вас нет гарантий, что 'uploadedImage' будет иметь правильное значение, когда вы нажмете' String url = uploadedImage.toString(); '. Вы это видите? Я не знаю, какие операции вы выполняете в 'uploadImage()', но вы, вероятно, захотите установить обратный вызов, чтобы узнать, когда ваша задача закончена. – vinitius

ответ

0

Я использовал ASyncTask и поместил карту в строку «url» в методе переопределения onPostExecute. Вышеупомянутые люди, которые сказали, что Задача не была закончена, были правильными. Спасибо всем за вашу помощь.

3

Тогда uploadedImage является null. Кроме того, вы должны сделать этот вызов синхронно, так как этот вызов

String url = uploadedImage.toString(); 

явно требует, чтобы uploadedImage быть инициализирован и не null;

if(isNetworkAvailable()) { 
    try { 
     //try to upload image 
     uploadedImage = uploadImage(); 
     TextView txtURL = (TextView) findViewById(R.id.textView); 
     String url = (uploadedImage != null) ? 
       uploadedImage.toString() : "null"; 
     txtURL.setText(url); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+2

Также обратите внимание на [Loaders] (http://developer.android.com/guide/components/loaders.html), они «упрощают асинхронную загрузку данных в действие или фрагмент». Определение значений _nice_ по умолчанию для ваших просмотров, а затем их обновление по мере поступления большего количества данных может обеспечить более отзывчивый (или приятный) опыт для ваших пользователей. –

0

Где код метода uploadImage()? Проверьте, что происходит внутри и почему оно вернет null?

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