android - AsyncTask作为内部类和静态字段问题

标签 android static android-asynctask inner-classes

我有一个方法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();更新所有geopoint,所以这两种方法都可以。仅当我尝试在内部类中调用此函数时,json 调用似乎才起作用,但静态变量 foundResults充满了null元素和程序无法正常工作。

有什么建议吗?

最佳答案

我已经明白问题出在哪里了。 您必须在 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();
           } 
        } 

一切都应该正常工作。

关于android - AsyncTask作为内部类和静态字段问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11404586/

相关文章:

android - 有没有一种方法可以防止 gridview 在其适配器的数据发生更改时滚动到其顶部位置?

android - AsyncTask 在尝试获取 token 时触发错误消息

java - Quickblox 中的 "File upload onError,Incorrect content type"

android - 使用 android 独立工具链交叉编译 C 源项目时构建错误

java - AsyncTask 中的 ArrayAdapter 出错

asp.net - 在静态类中存储连接 (ASP.NET)

java - 静态变量初始化java

java - this 关键字和 static

android - 当我关闭手机的互联网时,Kotlin 的 URL.readText() 崩溃

java - 使用导入静态字段是一种好的编程习惯吗?