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();
}
};
答案 0 :(得分:2)
由于您尚未发布任何代码,我只能给您一些随机可能的解决方案:
可能是你的AsyncTask花了很多时间下载。尝试使用android.os.Process.setThreadPriority(9)
doInBackground()
来提高优先级
检查代码中是否还有其他以前运行的AsyncTask。默认情况下,AsyncTask在单个后台线程上运行。这意味着除非先前的AsyncTask完成,否则不会执行AsyncTask任务。要允许并行执行,请使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params)
。您可以阅读更多here
检查Manifest中的Internet和其他权限。这主要是人们犯错的地方。
答案 1 :(得分:0)
AsyncTask与ThreadPool一起使用。如果执行的synctasks太多,后面的AsyncTask将被其他人阻止。我想你可以使用DDMS中的线程工具来检查执行的ayncTasks的数量。