【问题标题】:android asynctask is not executing inside baseadapterandroid asynctask 未在 baseadapter 内执行
【发布时间】:2015-09-18 23:28:01
【问题描述】:

我有一个用于列表视图的 Baseadapter,当单击其中的 1 个元素时,它应该执行 AsyncTask。 onClick 在 Baseadapter 内部并且可以工作但是异步执行在这里不起作用是我的 baseAdapter

public class LocalFeed_CustomView extends BaseAdapter {

    JSONObject names;
    Context ctx;
    LayoutInflater myiflater;

public  LocalFeed_CustomView(){}


    public LocalFeed_CustomView(JSONObject arr,Context c) {
        ctx = c;
        names = arr;
    //    myiflater = (LayoutInflater)c.getSystemService(c.LAYOUT_INFLATER_SERVICE);
      //  System.err.println("vv:" + arr);
    }


    @Override
    public int getCount() {
        try {
            JSONArray jaLocalstreams = names.getJSONArray("localstreams");
            return jaLocalstreams.length();
        } catch (Exception e) {
            Toast.makeText(ctx,"Error: Please try again",Toast.LENGTH_LONG).show();
            return names.length();
        }


    }




    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position,View convertView, ViewGroup parent) {
        try {
            if(convertView==null) {

                LayoutInflater li = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = li.inflate(R.layout.customadapter, null);
            }

                TextView votes= (TextView)convertView.findViewById(R.id.votes);

                JSONArray jaLocalstreams = names.getJSONArray("localstreams");
                final JSONObject jsonObject = jaLocalstreams.getJSONObject(position);
                jsonObject.getInt("id");
   // the click works because the toast message fires
            votes.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                      int Stream_ID= jsonObject.getInt("id");
                        SharedPreferences myaccount = ctx.getSharedPreferences("userInfo", ctx.MODE_PRIVATE);
                        int Profile_id=myaccount.getInt("id", 0);
                        Toast.makeText(ctx, "click worked", Toast.LENGTH_SHORT).show();
           // the execute below is not firing off
                      new Add_Votes(Stream_ID,Profile_id).execute();
                    }
                    catch (Exception e)
                    {
                        e.getCause();
                    }

                }
            });




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


    }
}

如您所见,执行不起作用,并且两个 int 值中都有数字。这是我的异步任务

public class Add_Votes extends AsyncTask<String,String,String> {
    HttpURLConnection conn;
    URL url;
    String result="";
    DataOutputStream wr;
    String Stream_URL;
    Activity m;
    int stream_id,profile_id;


    public Add_Votes(int stream_id,int profile_id)
    {
        this.stream_id=stream_id;
        this.profile_id=profile_id;

    }


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Stream_URL= m.getResources().getString(R.string.PathUrl)+"/api/addvote";
//this Toast never fires off
   Toast.makeText(m.getApplicationContext(),"clicked",Toast.LENGTH_SHORT);
    }

    @Override
    protected String doInBackground(String... params) {


        BufferedReader reader=null;
        try{
            url = new URL(Stream_URL);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.connect();

            conn.setReadTimeout(10000);
            conn.setConnectTimeout(15000);
            String cert="id="+profile_id+"&stream_id="+stream_id;
            wr = new DataOutputStream(conn.getOutputStream());
            wr.writeBytes(cert);
            wr.flush();
            wr.close();

            reader =  new BufferedReader(new InputStreamReader(conn.getInputStream()));
            StringBuilder sBuilder = new StringBuilder();

            String line = "";
            while ((line = reader.readLine()) != null) {
                sBuilder.append(line + "\n");
            }

            result = sBuilder.toString();
            reader.close();
            conn.disconnect();
            return result;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        return result;  
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        try {

           Toast.makeText(m.getApplicationContext(),"Voted",Toast.LENGTH_SHORT).show();

        }
        catch (Exception e) {
            Toast.makeText(m.getApplicationContext(),"Inconclusive",Toast.LENGTH_SHORT).show();
        }

    }
}

Add_Votes 只是一个 AsyncTask,没有与之关联的活动。关于如何从 baseadapter 调用 AsyncTask 的任何建议都会很棒。它需要来自一个基本适配器,因为每一行都有不同的值,具体取决于单击的项目,然后我将其传递给异步任务。

【问题讨论】:

    标签: android android-asynctask baseadapter


    【解决方案1】:

    我注意到你正在使用一个变量 Activity m 并且你没有在你的 AsyncTask 中初始化它。尝试将 context 从您的 BaseAdapter 传递给 AsyncTask。

    在 Add_Votes 中:

    private Context context;
    
    public Add_Votes(Context context ,int stream_id,int profile_id)
    {
        this.stream_id=stream_id;
        this.profile_id=profile_id;
        this.context = context;
    
    }
    
    
    
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Toast.makeText(context,"clicked",Toast.LENGTH_SHORT).show();
    
    }
    

    在您的 BaseAdapter 中:

    Add_Votes add_Votes = new Add_Votes(ctx,Stream_ID,Profile_id);
    add_Votes.execute();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多