1

AsyncTask在 Android 4.x 中运行良好,但不适用于 Android 2.3.6。我已经使用物理移动设备逐步调试了 Android 2.3.6。

它挂在这里:

myTask = new GetDataFromServer();

GetDataFromServer是 的类AsyncTask

这是怎么回事?

下面是我的代码,我在代码中只使用了 1 个 AsyncTask 并从服务器接收到消息。就这样。

class GetDataFromServer extends AsyncTask<String, String, String>
{

    protected void onPreExecute ()
    {

        progressDialog1=ProgressDialog.show(MainActivity.this, "Loading data", "Please wait...",true);
    }
    protected String doInBackground(String... params)
    {

        String resulttxt="";
        try {

            serverIp = InetAddress.getByName("192.168.1.123");


            int serverPort=31000;


            Socket clientSocket=new Socket(serverIp,serverPort);

            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
            bw.write(params[0]);
            bw.flush();


            BufferedReader  br=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));


            resulttxt=br.readLine();
            if(resulttxt.contains("OK"))
            {
                publishProgress(resulttxt);

            }
            else
            {
                publishProgress(resulttxt);
                clientSocket.close(); 
                bw.close();
                br.close();
                return null;

            }
            resulttxt="";
            resulttxt=br.readLine();
            resulttxt=resulttxt.trim();


            clientSocket.close(); 

        } catch (IOException e) {

            if(Status_txt!=null)
                Status_txt.append( "Server is done.");
        }
        catch (NetworkOnMainThreadException e){
            if(Status_txt!=null)
                Status_txt.append( "NetworkOnMainThreadException");
        }

        return resulttxt;


    }
    protected void onProgressUpdate(String...inStr){

        String[] strData=inStr[0].split("_");
        String szTemp="Last Purchase Date: ";


        szTemp+=strData[1];

        szTemp+="  ,Valid days: ";
        szTemp+=strData[2];
        //Status_txt.setText(szTemp);
        if(Status_txt!=null)
            Status_txt.setText("You Are The Super User");

    }
    protected void onPostExecute(String data) {
        tl_prediction2.removeAllViews();


        if (data == null)
        {

        }
        else {


            if((data.contains("#")==true) || (data.contains("*")==true) 
                    ||data.contains("&")==true)
            {




                String[] arrayTmp=data.split("#");
                for(Integer i=0;i<arrayTmp.length;i++)
                {
                    String[] SubArrayTmp=arrayTmp[i].split("_");

                    tl_prediction2.addView(generateRow(4,SubArrayTmp));

                }
            }

        }
        progressDialog1.dismiss();
    }

};
4

2 回答 2

2

由于您没有发布任何代码,我只能给您一些随机可能的解决方案:

  1. 可能是您的 AsyncTask 需要花费大量时间来下载。尝试使用android.os.Process.setThreadPriority(9)inside增加其优先级doInBackground()

  2. 检查您的代码中是否还有其他先前运行的长 AsyncTask。默认情况下,AsyncTask 在单个后台线程上运行。这意味着除非您之前的 AsyncTask 完成,否则您的 AsyncTask 任务不会被执行。为了允许并行执行使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params). 你可以在这里阅读更多

  3. 检查清单中的 Internet 和其他权限。这主要是人们犯错误的地方。

于 2013-04-19T03:05:55.343 回答
0

AsyncTask 与 ThreadPool 一起工作。如果执行的同步任务太多,后面的 AsyncTask 会被其他人阻塞。我认为您可以使用 DDMS 中的线程工具来检查正在执行的 ayncTask 数量。

于 2013-04-19T01:16:41.330 回答