2012-07-09 91 views
2

我有一个方法searchPlace()更新在谷歌地图的类A(FindItOnMap)中的自定义地点对象的static Arrays和更新各种地址的方法updateMap()。 我调用这些方法Button.onClick和所有正常工作。AsyncTask作为内部类和静态字段问题

由于这些方法使用互联网数据,这个操作可能需要一段时间,我一直在寻找类A内的内部类B(YourCustomAsyncTask)的实现,它扩展了AsyncTask以在处理这两个过程中显示等待对话方法

的用户建议这种形式的解决方案(即表面上似乎有效):

public class FindItOnMap extends MapActivity { 
    static Place[] foundResults; 
    private ProgressDialog dialog; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.ricerca_condominio); 
     mapView = (MapView)findViewById(R.id.mapView); 
      ........... 

     ((ImageButton) findViewById(R.id.btSearch)).setOnClickListener(mSearchListenerListener); 
    } 

    OnClickListener mSearchListener = new OnClickListener() { 
     public void onClick(View v) { 
      String location=editorLocation.getText().toString(); 
      String name=editorName.getText().toString(); 
      //Call the AsyncTask here 
      new YourCustomAsyncTask().execute(new String[] {name, location}); 
     } 
    }; 


    private class YourCustomAsyncTask extends AsyncTask <String, Void, Void> { 
     @Override 
     protected void onPreExecute() { 
      dialog = new ProgressDialog(Main.this); 
      dialog.setMessage("Loading...."); 
      dialog.setIndeterminate(true); 
      dialog.setCancelable(true); 
      dialog.show(); //Maybe you should call it in ruinOnUIThread in doInBackGround as suggested from a previous answer 
     } 

     @Override 
     protected Void doInBackground(String... strings) { 
      try { 
       search(strings[0], string[1]); 
       return null; 
      } catch(Exception e) { 
      } 
     } 

     @Override 
     protected void onPostExecute(Void params) { 
      updateMapWithResult(); 
      dialog.dismiss(); 
      //result 
     } 
..... 
    } 

等待的对话框显示和方法在后台调用, 但是,对于一些奇怪的原因静态列表foundResults结果填充各种null项目...

这怎么可能?

如果我调用内部类之外的方法搜索(位置,名称)都可以正常工作,并且updateMapWithResult();更新所有的地址,所以这两个方法都可以。只有当我试图在内部类中调用这个json调用似乎正在工作,但静态变量foundResults填充了null元素和程序无法正常工作。

有什么建议吗?

+0

是否有'foundResults'为'static'的具体原因?你的内部类应该能够访问它,而不是'静态'...不知道这是否能解决你的问题,但值得一试。 – 2012-07-09 23:22:58

+0

是的,是静态的,因为在其他各种静态程序中使用 – Asgard 2012-07-09 23:25:31

回答

2

我明白问题在哪里。 您必须在UI线程上运行搜索方法。

所以更改此代码块:

@Override 
     protected Void doInBackground(String... strings) { 
      try { 

       search(strings[0], string[1]); 
       return null; 

      } catch(Exception e) { 
      } 

     } 

与此

@Override 
     protected Void doInBackground(final String... strings) { 
      try { 
       runOnUiThread(new Runnable() { 
       public void run() { 
        search(strings[0], string[1]); 
        return null; 
        } 
       }); 

      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 

而且都应该正常工作。

+0

谢谢,这个作品! – Asgard 2012-07-10 16:07:49

0

这里有一个问题:

OnClickListener mSearchListener = new OnClickListener() { 
     public void onClick(View v) { 
       String Location=editorLocation.getText().toString(); 
       String name=editorName.getText().toString(); 
      //Call the AsyncTask here 
      new YourCustomAsyncTask().execute(new String[] {name, location}); 

     } 

Location应该是location

另外这里:

@Override 
     protected Void doInBackground(String... strings) { 
      try { 

       search(strings[0], string[1]); 

      } catch(Exception e) { 
      } 

     } 

    @Override 
    protected void onPostExecute(Void params) { 
     updateMapWithResult(); 
     dialog.dismiss(); 
     //result 

    } 

doInBackground您搜索后,你不分配一个值。你可以试试这个:

@Override 
     protected Void doInBackground(String... strings) { 
      try { 

       search(strings[0], string[1]); 
       String name = string[0]; 
       String location = string[1] 

      } catch(Exception e) { 
      } 

     } 

或其他什么东西会在运行时分配值。事实上,它似乎只是搜索,然后没有别的。

原因foundResultsnull是因为你永远不会给它赋值。

+0

位置是一个转换错误,是我的程序中的位置, 搜索是一个无效的静态方法,用一个值更新类的静态字段。 。为什么我必须明确赋值?我如何做到这一点? – Asgard 2012-07-10 07:49:45

0

您的AsyncTask没有任何问题。请包括search()方法。

+0

搜索方法是一种静态方法,它用一个值更新该类的静态字段,并在外部类中工作正常......问题是,当在内部类中调用外部类的静态字段时正确更新...所以我认为这并不重要如何实施搜索 – Asgard 2012-07-10 07:45:27