从片段调用 Android AsyncTask 没有调用其成员 - doInbackground、onpreexecute、onpostexecute

Posted

技术标签:

【中文标题】从片段调用 Android AsyncTask 没有调用其成员 - doInbackground、onpreexecute、onpostexecute【英文标题】:Android AsyncTask called from fragment none of its members called - doInbackground, onpreexecute, onpostexecute 【发布时间】:2021-02-22 10:11:35 【问题描述】:

我正在尝试读取返回 0 或 -1 的 uri。 从 Fragment 内部调用 asynctask。 基本上,当用户单击一个按钮时,它的登录是在远程服务器上检查输入。

在调试器中,任务显示为 RUNNING 但从未完成,也没有调用被覆盖的成员,这可以解释为什么它什么都不做。

登录密码是:

// Validate the user.
    String uri = HLConsts.SERV_URI + "ValidateLoginUser?uname=" + szUserName + "&password=" + szPassword + "&android=1";
    ReadUri rd = new ReadUri(uri);
    int cnt =0;
    rd.execute();
    while ( rd.getSzReturn() == null  || cnt > 5) 
        try 
            Thread.sleep(500);
         catch (InterruptedException e) 
            e.printStackTrace();
        
        cnt++;
    
    if(cnt > 5) 
        errors++;
    

    String szValid = rd.getSzReturn();

        Snackbar.make(root, "Name = " + szUserName + " Pass = " + szPassword , Snackbar.LENGTH_LONG)
            .setAction("Action", null).show();

============================= 异步任务是:

public class ReadUri  extends AsyncTask< Void , Void, String> 
 //   private Context mContext;
    private String mUrl;
    private String szReturn = null;



    public String getSzReturn() 
        return szReturn;
    

    public ReadUri(  String url) 
      //  mContext = context;
        mUrl = url;
    

    @Override
    protected void onPreExecute() 
        super.onPreExecute();


     //   dynamictext = (TextView)   myView.findViewById(R.id.textview_first);
    

    @Override
    protected String doInBackground(Void... params) 
        String resultString = null;
        resultString = getString(mUrl);

        return resultString;
    

    @Override
    protected void onPostExecute(String strings) 
        super.onPostExecute(strings);
        szReturn =strings;
    


    //======================================================================================
    private String getString(String InUrl) 

        String ret = "Nothing";


        URL url = null;
        try 
            url = new URL(InUrl);
         catch (MalformedURLException e) 
            e.printStackTrace();
        


        HttpURLConnection httpURLConnection = null;
        try 
            httpURLConnection = (HttpURLConnection) url.openConnection();
         catch (IOException e) 
            e.printStackTrace();
        

        // The line below is where the exception is called
        int response = 0;
        try 
            response = httpURLConnection.getResponseCode();
         catch (IOException e) 
            e.printStackTrace();
        
        Log.i("Response", String.valueOf(response));

        if (response == HttpURLConnection.HTTP_OK) 
            // Response successful
            InputStream inputStream = null;
            try 
                inputStream = httpURLConnection.getInputStream();
             catch (IOException ex) 
                ex.printStackTrace();
            

            // Parse it line by line
            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(inputStream));
            String line;
            StringBuffer sb = new StringBuffer();
            while (true) 
                try 
                    //             if (!((temp = bufferedReader.readLine()) != null)) 
                    while((line=bufferedReader.readLine())!=null)
                    
                        //   sb.append(line);      //appends line to string buffer
                        //   sb.append("\n");     //line feed
                        ret += line;
                        Log.w("MyApp",line);
                    
                 catch (IOException ex) 
                    ex.printStackTrace();
                
                // Parsing of data here

            
         else 
            Log.e("SAMES", "INCORRECT RETURN CODE: " + response);
        

        httpURLConnection.disconnect();

        //  urlConnection.disconnect();
        try 
            Thread.sleep(500);
         catch (InterruptedException e) 
            e.printStackTrace();
        
        return ret;
    

请你帮忙。我设置了断点,没有一个被触发,doInBackground 也没有被调用。

谢谢 杰夫。

【问题讨论】:

rd.execute(); 删除该语句之后的所有代码行。在 onPostExecute 中处理结果。 || cnt &gt; 5) 我想你提到了|| cnt &lt; 5)。但无论如何,这是糟糕的编码。关注我的第一条评论。 【参考方案1】:

已通过不使用外部类来运行异步任务来解决此问题。

示例如下: AsyncTask Android example

【讨论】:

以上是关于从片段调用 Android AsyncTask 没有调用其成员 - doInbackground、onpreexecute、onpostexecute的主要内容,如果未能解决你的问题,请参考以下文章

从片段中调用分离的异步任务类

如何从选项卡片段中的 AsyncTask Resftful WS 加载批量数据

如何在将 Tablayout 与 viewpager 一起使用时从另一个片段调用 AsyncTask?

Android 从 AsyncTask 调用 notifyDataSetChanged

从 asyncTask doInBackground 调用 Activity

如何从android中的自定义适配器调用Activity asynctask