2

我有一种方法searchPlace()可以static Arrays使用谷歌地图更新 A 类(FindItOnMap)中的自定义地点对象,以及updateMap()更新各种地理点的方法。我调用这些方法Button.onClick并且一切正常。

由于这些方法使用互联网数据,因此此操作可能需要一段时间,我一直在寻找YourCustomAsyncTask类 A 内部的内部类 B() 的实现,该类扩展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项目......

这怎么可能?

如果我在内部类之外调用方法 search(location, name) 都可以正常工作并updateMapWithResult();更新所有地理点,所以这两种方法都可以。只有当我尝试在内部类中调用它时,json 调用似乎正在工作,但静态变量foundResults充满了null元素并且程序无法正常工作。

有什么建议吗?

4

3 回答 3

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();
           } 
        } 

一切都应该正常工作。

于 2012-07-10T08:34:59.753 回答
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因为你从来没有给它赋值。

于 2012-07-09T23:45:31.940 回答
0

你的没有什么问题AsyncTask。请附上search()方法。

于 2012-07-10T02:27:58.663 回答