2015-01-09 117 views
-1

这里是活动的代码,造成问题的是while循环它阻塞了ui线程,但它停止了控制直到加载完成,我想要的是显示一些图像,直到asynctask完成任务,如果成功然后screen1其他screen2.what目前我看到的只是黑屏。 Plz帮助。如何显示加载屏幕,直到完成asynctask加载

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.URI; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
import android.widget.ProgressBar; 
import android.widget.Spinner; 


public class loadingscreen extends Activity { 


public final static String UID_MESSAGE="abe user name hai be"; 
int al=0,rt=0; 

public static Spinner pb; 
SharedPreferences save; 
TelephonyManager tel; 
SharedPreferences.Editor editor; 
networker create; 

String def=null; 
String newt=null; 
String imei=null; 
String bus="AA"; 
Context context; 
Intent intent; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState);      
    save=getSharedPreferences("map",MODE_PRIVATE); 
    editor=save.edit(); 
    tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);   
    setContentView(R.layout.loading); 
    pb=(Spinner)findViewById(R.id.pb); 

    def=save.getString("uid","test"); 
    imei=tel.getDeviceId();  


    if(!(def.equals("true"))){ 

      Log.e(null," please wait logging in ");   

      new fsnetworker(context,0,0,0,5).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,imei,def,bus); 

      while(fsnetworker.done==0){ Log.e(null,"trying "); } 

      if(fsnetworker.done==4){      

       intent = new Intent(getBaseContext(),MapActivity.class); 
       intent.putExtra(UID_MESSAGE, def);         
       startActivity(intent);                                                  
      }  
    } 


    intent = new Intent(getBaseContext(),firstScreen.class); 
    intent.putExtra(UID_MESSAGE, def);         
    startActivity(intent); 

} 


public static class fsnetworker extends AsyncTask<String,Void,String>{ 

Context context;     
double lat=0f; 
double lng=0f; 
float acc=0; 
int rt=0; 
String imei; 
String uid; 
String bus; 
public static int done; 

public fsnetworker(Context context,double lat2,double lng2,float acc2,int rt){ 

this.context=context; 
this.lat=lat2; 
this.lng=lng2; 
this.acc=acc2; 
this.rt=rt; 

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


} 

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


} 


@Override 
protected String doInBackground(String... arg0) { 
    try{ 
     done=0; 
     Log.e(null,"networking"); 
     imei=(String)arg0[0]; 
     uid=(String)arg0[1]; 
     bus=(String)arg0[2]; 


     HttpClient client=new DefaultHttpClient(); 
      HttpGet get=new HttpGet(); 
      get.setURI(new URI("http://*********************?" 
        +"imei="+imei 
        +"&name="+uid 
        +"&lat="+lat 
        +"&lng="+lng 
        +"&acc="+acc 
        +"&bus="+bus 
        +"&rt="+rt)); 

      HttpResponse response=client.execute(get); 
      HttpEntity entity=response.getEntity(); 

      BufferedReader sread=new BufferedReader(new InputStreamReader(entity.getContent())); 
      StringBuilder sb = new StringBuilder(); 
      String out=null; 
      while((out=sread.readLine())!=null){ 
       sb.append(out); 
       break; 
      } 

     Log.e(" url", ""+sb.toString()); 

回答

0

你不需要跟踪你的AsyncTask的当前状态。您可以识别您的AsyncTask何时完成,当AsyncTask完成其任务时,它将调用onPostExecute方法。

你修改后的代码

import java.io.BufferedReader; 
 
import java.io.InputStreamReader; 
 
import java.net.URI; 
 

 
import org.apache.http.HttpEntity; 
 
import org.apache.http.HttpResponse; 
 
import org.apache.http.client.HttpClient; 
 
import org.apache.http.client.methods.HttpGet; 
 
import org.apache.http.impl.client.DefaultHttpClient; 
 

 
import android.app.Activity; 
 
import android.app.ProgressDialog; 
 
import android.content.Context; 
 
import android.content.Intent; 
 
import android.content.SharedPreferences; 
 
import android.os.AsyncTask; 
 
import android.os.Bundle; 
 
import android.telephony.TelephonyManager; 
 
import android.util.Log; 
 
import android.widget.ProgressBar; 
 
import android.widget.Spinner; 
 

 

 
public class loadingscreen extends Activity { 
 

 

 
public final static String UID_MESSAGE="abe user name hai be"; 
 
int al=0,rt=0; 
 

 
public static Spinner pb; 
 
SharedPreferences save; 
 
TelephonyManager tel; 
 
SharedPreferences.Editor editor; 
 
networker create; 
 

 
String def=null; 
 
String newt=null; 
 
String imei=null; 
 
String bus="AA"; 
 
Context context; 
 
Intent intent; 
 

 
@Override 
 
protected void onCreate(Bundle savedInstanceState) { 
 
super.onCreate(savedInstanceState);      
 
    save=getSharedPreferences("map",MODE_PRIVATE); 
 
    editor=save.edit(); 
 
    tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);   
 
    setContentView(R.layout.loading); 
 
    pb=(Spinner)findViewById(R.id.pb); 
 

 
    def=save.getString("uid","test"); 
 
    imei=tel.getDeviceId();  
 

 

 
    if(!(def.equals("true"))){ 
 

 
      Log.e(null," please wait logging in ");   
 

 
      new fsnetworker(context,0,0,0,5).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,imei,def,bus); 
 
    
 
    } 
 

 

 
    intent = new Intent(getBaseContext(),firstScreen.class); 
 
    intent.putExtra(UID_MESSAGE, def);         
 
    startActivity(intent); 
 

 
} 
 

 

 
public static class fsnetworker extends AsyncTask<String,Void,String>{ 
 

 
Context context;     
 
double lat=0f; 
 
double lng=0f; 
 
float acc=0; 
 
int rt=0; 
 
String imei; 
 
String uid; 
 
String bus; 
 
public static int done; 
 

 
public fsnetworker(Context context,double lat2,double lng2,float acc2,int rt){ 
 

 
this.context=context; 
 
this.lat=lat2; 
 
this.lng=lng2; 
 
this.acc=acc2; 
 
this.rt=rt; 
 

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

 

 
} 
 

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

 
intent = new Intent(getBaseContext(),MapActivity.class); 
 
       intent.putExtra(UID_MESSAGE, def);         
 
       startActivity(intent); 
 

 
} 
 

 

 
@Override 
 
protected String doInBackground(String... arg0) { 
 
    try{ 
 
     done=0; 
 
     Log.e(null,"networking"); 
 
     imei=(String)arg0[0]; 
 
     uid=(String)arg0[1]; 
 
     bus=(String)arg0[2]; 
 

 

 
     HttpClient client=new DefaultHttpClient(); 
 
      HttpGet get=new HttpGet(); 
 
      get.setURI(new URI("http://*********************?" 
 
        +"imei="+imei 
 
        +"&name="+uid 
 
        +"&lat="+lat 
 
        +"&lng="+lng 
 
        +"&acc="+acc 
 
        +"&bus="+bus 
 
        +"&rt="+rt)); 
 

 
      HttpResponse response=client.execute(get); 
 
      HttpEntity entity=response.getEntity(); 
 

 
      BufferedReader sread=new BufferedReader(new InputStreamReader(entity.getContent())); 
 
      StringBuilder sb = new StringBuilder(); 
 
      String out=null; 
 
      while((out=sread.readLine())!=null){ 
 
       sb.append(out); 
 
       break; 
 
      } 
 

 
     Log.e(" url", ""+sb.toString());

+0

我如何去地图活动? – abhimanyud3dx 2015-01-09 19:52:44

+0

请参阅onPostExecute方法 – BeingMIAkashs 2015-01-09 19:53:18

+0

我仍然收到错误,可能是我将从异步类中删除静态 – abhimanyud3dx 2015-01-09 19:55:01

1

你似乎没有得到AsyncTasks。它们并行执行。因此,在调用execute之后,您不会放置想要执行的代码。你把它放在onPostExecute函数中,任务完成后在UI线程上调用它。你永远不会循环,休眠或以其他方式等待,直到一个AsyncTask完成 - 这是针对整个点。

+0

那么根据ü怎么办,这是正常工作,我只是需要显示加载屏幕,直到它完成。 – abhimanyud3dx 2015-01-09 19:35:00

+0

完成任务完成后要执行的任何操作。把它放在onPostExecute。去除循环。除非你这样做,否则你的应用程序将不会显示任何更改,直到任务完成。如果由于在UI线程上跳过看门狗定时器而导致任务不平凡,它将在大多数手机上崩溃。 – 2015-01-09 19:36:47

+0

我想开始一个新的活动,但startActivity();不能在那里调用。 – abhimanyud3dx 2015-01-09 19:40:11