0

我的代码导致问题是在我的应用程序的MainActivity。在onCreate方法中有一个运行名为uploadImage()的方法的Thread。这然后返回一个地图,并在uploadedImage(一个地图实例)中设置。在线程后,public Map uploadedImage为空。 (它会在声明的行上抛出一个NullPointerExeption)。有没有人知道为什么uploadedImage在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的专家,但我的猜测是线程在访问它之前没有机会分配uploadedImage。 – 2015-03-19 03:44:21

+1

因为你把它作为一个新的线程。使用asynctask然后把它们放在onPostExecute()。或者把它们放到你的线程中,然后用runOnUiThread()调用开头< - 我还没有试过这个 – 2015-03-19 03:45:31

+1

你现在这样做的方式,你没有保证'uploadedImage'将会在你点击' String url = uploadedImage.toString();'。你看到了吗?我不知道你在'uploadImage()'中做了什么样的操作,但是你可能想设置一个回调来知道你的任务完成的时间。 – vinitius 2015-03-19 03:48:31

回答

0

我使用了一个ASyncTask,并在onPostExecute覆盖方法中的字符串“url”中放置了Map。 上述说任务未完成的人是正确的。感谢大家的帮助。

3

然后uploadedImagenull。此外,你应该做的是调用同步,因为此调用

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_默认值,然后在更多数据可用时更新它们可以为您的用户提供更具响应性(或令人愉快)的体验。 – 2015-03-19 03:52:31

0

方法uploadImage()的代码在哪里?检查里面发生了什么,为什么它会返回null?

相关问题