android:异步进程从onPostExecute获取数据后查看,或者将视图传递给onPostExecute



我正试图在视图中添加额外的输入字段。

我首先用async函数从url中读取json字符串,并用GSON将其动态映射到带有hasmap的对象。

接下来,我想迭代hashmap来创建和添加输入字段:

public class NewProductActivity extends Activity {
    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_product);
     TextView view =  (TextView) this.findViewById(android.R.id.content);// is this the correct way to get view?
    new loadTemplateAttributes(view).execute();// android studio complains about passing view here
   .. snip...
    class loadTemplateAttributes extends AsyncTask<String, String, HashMap> {
    HashMap mymap;
    .. snip...
 protected void onPostExecute(HashMap mymap) {
        pDialog.dismiss();
        Iterator it = mymap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry) it.next();
            String name = (String) pair.getKey();
            TemplateAttribureProperties t = (TemplateAttribureProperties) pair.getValue();
            String type = t.getType();
            System.out.println("Name=" + name + " type=" + type);
            LinearLayout ll = (LinearLayout) findViewById(R.id.linearLayout2);
            // add text view
            TextView tv = new TextView(this); // 'this' is unknow here
            tv.setText(name);
            ll.addView(tv);
            EditText et = new EditText(view); // 'view' is what i want to pass but dont know how
            et.setText();
            ll.addView(et);
            it.remove(); 
        }

问题是onPostExecute函数内部的"this"是未知的。

我读过一些关于将视图传递给async函数的文章,但对我来说,不清楚如何首先获得视图,以及如何在…之后传递视图。。。

此外,根据评论,许多选项似乎不起作用,因为它们被弃用或不安全,因为它们可能会导致内存泄漏。

真的在这里迷路了。

我不知道你在做什么,但你可以在onCreate()之前使用Context context;TextView view;,使其全局化,然后你可以在方法中调用TextView tv = new TextView(context);

public class NewProductActivity extends Activity {
Context context=this;
private TextView view;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_product);
    view =  (TextView) findViewById(android.R.id.content);
}

new loadTemplateAttributes(view).execute();//安卓工作室抱怨在这里传递视图

您必须将构造函数添加到异步任务中,如下所示:

  class loadTemplateAttributes extends AsyncTask<String, String, HashMap> {
      View view;
      public loadTemplateAttributes(View v) {
          view = v;
      }

TextView tv=新建TextView(this);//'这是未知的

在java中的内部类中,您可以使用NewProductActivity.this语法引用父类。

EditText et=新建EditText(视图);//'观点是我想传递的,但不知道如何传递et.setText();

您可以像我上面描述的那样使用带有构造函数的ach,或者直接引用活动视图:NewProductActivity.this.view。但您必须在活动中将视图作为类字段。

高级:使活动成为内部类而不是静态类,并向其传递视图,可能会导致引用泄漏,如果您使用由于屏幕旋转而无效的视图(在AsyncTask内),还会导致崩溃。如果AsyncTask正在执行网络操作,则这种情况尤其可能发生。为了防止它总是使AsyncTasks成为静态的,如果您将视图或活动传递给它们,则将这些引用包装在WeakReference<>

相关内容

最新更新