【问题标题】:Android AsyncTask : Passing single "String" from ArayList to be executedAndroid AsyncTask:从 ArrayList 传递单个“字符串”以执行
【发布时间】:2014-01-21 15:36:42
【问题描述】:

我正在尝试将单个“字符串”传递给 AsyncTask。找了一整天,还是没找到。我在ArrayList 中有一些数据,我得到一个数据(字符串)到AsyncTask,但它不起作用。但是当我用引号传递字符串时,它的工作原理。这是我来自ArrayList 的第一个示例代码:

ArrayList<String> example= new ArrayList<String>();//we consider it have data
new Mytask().execute(example.get(0).toString());

这是我的第二个带单引号字符串的代码:

String example="exm";
new Mytask().execute(example);

这是我的 AsyncTask 代码:

@Override
protected String doInBackground(String... params) {
    String str = params[0];

    return str;
 }

我对这两种方法都使用了 AsyncTask 代码:ArrayList 和单个字符串。但它只适用于带引号的字符串,我一直在尝试这样的另一种方法,但仍然无法正常工作:

ArrayList<String> example= new ArrayList<String>();
String exmpl=example.get(0).toString();
new Mytask().execute(exmpl);

请帮助我,我的错误在哪里,我该如何解决这个问题。谢谢

更新:这是我的完整代码:

public class MasterTokoActivity extends Activity{

TextView new_namaToko,new_alamat;
Spinner new_provinsi,new_kota,new_kecamatan;
mydatabase db;
ProgressBar load_prov,load_kota,load_kec;

ArrayList<String> propinsi = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mastertoko);

    new_namaToko = (TextView) findViewById(R.id.new_namaToko);
    new_alamat = (TextView) findViewById(R.id.new_alamat);
    new_provinsi = (Spinner) findViewById(R.id.new_provinsi);
    new_kota = (Spinner) findViewById(R.id.new_kota);
    load_prov = (ProgressBar) findViewById(R.id.load_prov);
    load_kota = (ProgressBar) findViewById(R.id.load_kota);

    new MyasyncTask().execute();
    new_provinsi.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id){

            new MyasyncTaskkota().execute(propinsi.get(pos));
    }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    });

}

public class MyasyncTask extends AsyncTask<String, Integer, Integer>{

    @Override
     public void onPreExecute() {       
        load_prov.setVisibility(View.VISIBLE);
        new_provinsi.setClickable(false);
        new_provinsi.setEnabled(false);
      }

     @Override
     protected Integer doInBackground(String... arg0) {
     // TODO Auto-generated method stub  
         int result=-1;

            db = new mydatabase(getApplicationContext());
            propinsi=db.ambilProvinsi();             
     if(propinsi.size()!=0)
     { 
        result=1;
     }
     return result;
     }

     @Override
     protected void onPostExecute(Integer result){
         super.onPostExecute(result);   
         if(result==1){

             ArrayAdapter<String> adapterProv = new ArrayAdapter<String>(MasterTokoActivity.this,android.R.layout.simple_spinner_item, propinsi);
             adapterProv.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
             new_provinsi.setAdapter(adapterProv);

         }
         load_prov.setVisibility(View.INVISIBLE);
         new_provinsi.setClickable(true);
         new_provinsi.setEnabled(true);


     }
     }

public class MyasyncTaskkota extends AsyncTask<String, Integer, Integer>{
    ArrayList<String> kota = new ArrayList<String>();
    @Override
     public void onPreExecute() {       
        load_kota.setVisibility(View.VISIBLE);
        new_kota.setClickable(false);
        new_kota.setEnabled(false);
      }

     @Override
     protected Integer doInBackground(String... prov) {
     // TODO Auto-generated method stub  
         int result=-1;
            db = new mydatabase(getApplicationContext());
            kota=db.ambilKota(prov[0]);
     if(kota.size()!=0)
     { 
        result=1;
     }
     return result;
     }

     @Override
     protected void onPostExecute(Integer result){
         super.onPostExecute(result);   
         if(result==1){

             ArrayAdapter<String> adapterKota = new ArrayAdapter<String>(MasterTokoActivity.this,android.R.layout.simple_spinner_item, kota);
             adapterKota.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
             new_kota.setAdapter(adapterKota);
             adapterKota.notifyDataSetChanged();
         }
         load_kota.setVisibility(View.INVISIBLE);
         new_kota.setClickable(true);
        new_kota.setEnabled(true);
     }
     }
}

这是我的数据库助手中的ambilProvinsi() 方法:

public ArrayList<String> ambilProvinsi(){
    SQLiteDatabase db = getReadableDatabase();
    Cursor cur;

    ArrayList<String> sv=new ArrayList<String>();

    cur = db.query("propinsi", new String []{"nama_propinsi"}, null, null, null, null, null);
    cur.moveToFirst();
    if (!cur.isAfterLast()){
        do{                 
            sv.add(cur.getString(0));
        }while (cur.moveToNext());
    }

return sv;
}

并且logCat中没有错误。

【问题讨论】:

  • 不需要使用example.get(0).toString(),使用example.get(0)即可。它已经是一个 ArrayList(),所以使用 toString() 是多余的。
  • 这是什么意思,“//我们认为它有数据”?在您调用get(0) 之前它是否有数据?
  • 我也已经在使用example.get(0)。但它也不起作用
  • @codeMagic 它有数据,然后我打电话给get(0)
  • 当你说“它不工作”时,你的意思是什么? logcat 说什么?

标签: android arraylist android-asynctask


【解决方案1】:

正如我在评论中提到的,使用 toString() 是多余的,所以你应该把它去掉。另外,您确定您没有传递空/空数据吗?你肯定没有检查你的输入......首先,你应该改变:

@Override
protected String doInBackground(String... params) {
    String str = params[0];

    if(str == null)     
         throw new NullPointerException("Provided null string to: " + getClass().getSimpleName());

    return str;
 }

【讨论】:

  • 在将它传递给异步任务之前,我已经检查了它。在我打电话给new Mytask().execute(example.get(0).toString()); 之前,我使用吐司打印它。它告诉我不为空
  • 发布更多原始源代码,因为从上面的代码中可以看出,您在一个空的 ArrayList 上调用 get。如果这不是您在实际代码中所做的,我们应该如何帮助找到问题?
【解决方案2】:

感谢大家的回答,我的所有代码现在都可以正常工作,无需更改。 问题来自我的数据编码。一旦我将数据编码更改为 utf8,我的应用程序将正常运行。Charset for Android 可以找到here

【讨论】:

    【解决方案3】:

    这很奇怪。但是你可以尝试在构造函数中传递你的字符串,我认为它必须有效。

    private class MyTask extends AsyncTask<Void, Void, String> {
    
        private final String str;
    
        public MyTask(final String str) {
            this.str = str;
        }
    
        @Override
        protected String doInBackground(Void... params) {
            //process this.str and return result
        }
    
        //post execute 
    }
    

    然后打电话

    new MyTask(someString).execute();
    

    你也忘了在ambilProvinsi()方法中关闭光标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多