2013-04-19 61 views
1

AsyncTask在Android 4.x中正常工作,但在Android 2.3.6中不起作用。我已經使用物理移動設備一步一步調試了Android 2.3.6。AsyncTask在開始時掛起

在這裏掛在:

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(); 
    } 

}; 
+1

您還必須發佈GetDataFromServer類的代碼。 – Sharj

+1

發佈logcat stacktrace – Daniel

回答

0

AsyncTask適用於ThreadPool。如果執行的synctasks太多,後面的AsyncTask將被其他人攔截。我認爲你可以使用DDMS中的線程工具來檢查執行多少個ayncTasks。

+0

我只用了一個asynctask。它可能是Android的版本? – OwenChen

+0

掛在新的GetDataFromServer()?在PreExecute()和doInBackground()中添加一些日誌 – buptcoder

2

既然你還沒有發佈任何代碼,我只能給你一些隨機的解決方案可能:

  1. 可能是你的AsyncTask正在採取了大量的時間來下載。嘗試增加其優先使用android.os.Process.setThreadPriority(9)裏面doInBackground()

  2. 檢查您是否有其他以前在您的代碼中運行長AsyncTask。 AsyncTask默認在一個後臺線程上運行。這意味着除非您之前的AsyncTask完成,否則您的AsyncTask任務將不會執行。要允許並行執行,請使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params)。您可以閱讀更多here

  3. 在Manifest中檢查Internet和其他權限。這主要是人們犯錯的地方。