2015-01-09 6 views
-1

다음은 활동을위한 코드입니다. 문제를 만드는 것은 while 루프가 UI 스레드를 차단하지만로드가 완료 될 때까지 제어를 중단합니다. asynctask가 완료 될 때까지 어떤 이미지를 보여주는 것은 성공이면 task이고 그렇지 않다면 screen2는 현재 화면이 검은 색이다. 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

+0

onPostExecute 메서드를 참조하십시오. – BeingMIAkashs

+0

여전히 오류가 발생합니다. 비동기 클래스에서 정적을 제거해야합니다. – abhimanyud3dx

1

AsyncTasks가없는 것 같습니다. 그들은 병렬로 실행됩니다. 따라서 execute를 호출 한 후에 실행하고자하는 코드를 넣지 마십시오. 작업이 완료된 후 UI 스레드에서 호출되는 onPostExecute 함수에 넣습니다. AsyncTask가 끝날 때까지 루프, 절전 또는 다른 방법으로 기다리지 마십시오. 전체 지점을 기준으로합니다.

+0

그래서 내가 할 것이다 U에 따르면,이 제대로 작동 내가 그냥이 완료 될 때까지 로딩 화면을 표시해야합니다. – abhimanyud3dx

+0

작업이 끝나면 원하는 모든 작업을 시작하십시오. 그것을 onPostExecute에 넣으십시오. 루프를 제거하십시오. 그렇게하지 않으면 작업이 끝날 때까지 앱에 변경 사항이 표시되지 않습니다. UI 스레드에서 워치 독 타이머를 트립하기 때문에 작업이 중요하지 않은 경우 대부분의 휴대 전화에서 충돌이 발생합니다. –

+0

새로운 활동을 시작하고 싶지만 startActivity(); 그곳에 전화 할 수 없습니다. – abhimanyud3dx

관련 문제