Skip to main content
 首页 » 编程设计

android之尝试使用AsyncTask解决来自Android的此Web服务调用

2025年12月25日37haluo1

我是Android开发的初学者。我正在开发一个广泛中继Web服务调用的应用程序。第一个屏幕显示用户名和密码,并通过调用Webservice验证用户。如果U / P有效,那么我需要启动第二个 Activity 。在第二个 Activity 中,我需要打3个电话。但是我还没有到达第二部分。实际上,我尚未完成完整的编码。但是我想测试一下该应用程序是否正常运行。

调用webserivce时,我正在显示警报对话框。但是该应用程序崩溃了。
将显示LoginActivity。当我输入U / P并按登录按钮时,它崩溃。

我的 class :

TaskHandler.java

 public class TaskHandler { 
 
private String URL; 
private User userObj; 
private String results; 
private JSONDownloaderTask task; ; 
 
public TaskHandler( String url, User user) { 
    this.URL = url; 
    this.userObj = user; 
} 
 
public String handleTask() { 
    Log.d("Two", "In the function"); 
    task = new JSONDownloaderTask(); 
    Log.d("Three", "In the function"); 
    task.execute(URL); 
    return results; 
} 
 
private class JSONDownloaderTask extends AsyncTask<String, Void, String> { 
 
    private String username;// = userObj.getUsername(); 
    private String password; //= userObj.getPassword(); 
 
    public  HttpStatus status_code; 
 
    public JSONDownloaderTask() { 
        Log.d("con", "Success"); 
        this.username = userObj.getUsername(); 
        this.password = userObj.getPassword(); 
 
        Log.d("User" + this.username , " Pass" + this.password); 
    } 
 
    private AsyncProgressActivity progressbar = new AsyncProgressActivity(); 
 
    @Override 
    protected void onPreExecute() { 
        progressbar.showLoadingProgressDialog(); 
    } 
 
    @Override 
    protected String doInBackground(String... params) { 
 
        final String url = params[0]; //getString(R.string.api_staging_uri) + "Authenticate/"; 
 
        // Populate the HTTP Basic Authentitcation header with the username and password 
        HttpAuthentication authHeader = new HttpBasicAuthentication(username, password); 
        HttpHeaders requestHeaders = new HttpHeaders(); 
        requestHeaders.setAuthorization(authHeader); 
        requestHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); 
 
        // Create a new RestTemplate instance 
        RestTemplate restTemplate = new RestTemplate(); 
 
        restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter()); 
 
        try { 
            // Make the network request 
            Log.d(this.getClass().getName(), url); 
 
            ResponseEntity<Message> response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<Object>(requestHeaders), Message.class); 
            status_code =  response.getStatusCode(); 
            return response.getBody().toString(); 
        } catch (HttpClientErrorException e) { 
 
            status_code = e.getStatusCode(); 
            return new Message(0, e.getStatusText(), e.getLocalizedMessage(), "error").toString(); 
        } catch ( Exception e ) { 
            Log.d(this.getClass().getName()  ,e.getLocalizedMessage()); 
            return "Unknown Exception"; 
        } 
    } 
 
 
    @Override 
    protected void onPostExecute(String result) { 
        progressbar.dismissProgressDialog(); 
 
 
        switch ( status_code ) { 
        case UNAUTHORIZED: 
            result =  "Invalid username or passowrd"; break; 
        case ACCEPTED: 
            result = "Invalid username or passowrd" + status_code; break; 
        case OK: 
            result = "Successful!"; break; 
        } 
    } 
} 
} 

AsycProgressActivity.java
public class AsyncProgressActivity  extends Activity { 
 
protected static final String TAG = AsyncProgressActivity.class.getSimpleName(); 
 
private ProgressDialog progressDialog; 
private boolean destroyed = false; 
 
@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    destroyed = true; 
} 
 
public void showLoadingProgressDialog() { 
    Log.d("Here", "Progress"); 
    this.showProgressDialog("Authenticating..."); 
    Log.d("Here", "afer p"); 
} 
 
public void showProgressDialog(CharSequence message) { 
    Log.d("Here", "Message"); 
    if (progressDialog == null) { 
        progressDialog = new ProgressDialog(this); 
        progressDialog.setIndeterminate(true); 
    } 
    Log.d("Here", "Message 2"); 
 
    progressDialog.setMessage(message); 
    progressDialog.show(); 
} 
 
public void dismissProgressDialog() { 
    if (progressDialog != null && !destroyed) { 
        progressDialog.dismiss(); 
    } 
} 
} 

LoginActivity.java
public class LoginActivity extends AsyncProgressActivity implements OnClickListener { 
 
Button login_button; 
HttpStatus status_code; 
 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
 
    setContentView(R.layout.main); 
 
    login_button = (Button) findViewById(R.id.btnLogin); 
    login_button.setOnClickListener(this); 
    ViewServer.get(this).addWindow(this);  
} 
 
public void onDestroy() {   
    super.onDestroy();   
    ViewServer.get(this).removeWindow(this);   
}   
 
public void onResume() {   
    super.onResume();   
    ViewServer.get(this).setFocusedWindow(this);   
}   
 
public void onClick(View v) { 
    if ( v.getId() == R.id.btnLogin ) { 
 
        User userobj = new User(); 
        String result; 
        userobj.setUsername( ((EditText) findViewById(R.id.username)).getText().toString()); 
        userobj.setPassword(((EditText) findViewById(R.id.password)).getText().toString() ); 
 
 
        TaskHandler handler = new TaskHandler(getString(R.string.api_staging_uri) + "Authenticate/", userobj); 
        Log.d(this.getClass().getName(), "One"); 
        result = handler.handleTask(); 
        Log.d(this.getClass().getName(), "After two"); 
        Utilities.showAlert(result, LoginActivity.this); 
    } 
} 

实用工具
public class Utilities { 
 
public static void showAlert(String message, Context context) { 
 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); 
    alertDialogBuilder.setTitle("Login"); 
 
    alertDialogBuilder.setMessage(message) 
                      .setCancelable(false) 
                      .setPositiveButton("OK",new DialogInterface.OnClickListener() { 
                        public void onClick(DialogInterface dialog,int id) { 
                            dialog.dismiss(); 
                            //dialog.cancel(); 
                        } 
                       }); 
    alertDialogBuilder.setIcon(drawable.ic_dialog_alert); 
 
    // create alert dialog 
    AlertDialog alertDialog = alertDialogBuilder.create(); 
 
    // show it 
    alertDialog.show();  
} 
 } 

编辑:更多信息

我试图逐步添加日志记录,以查看其崩溃的位置。看来它在这里崩溃了。因为此后它没有显示日志消息。
        Log.d("Here", "Message"); 
    if (progressDialog == null) { 
        progressDialog = new ProgressDialog(this); 
        progressDialog.setIndeterminate(true); 
    } 
    Log.d("Here", "Message 2"); 
Message 2未显示在日志中,但 Message显示。

请您参考如下方法:

我认为问题是您的handleTask方法:

public String handleTask() { 
    Log.d("Two", "In the function"); 
    task = new JSONDownloaderTask(); 
    Log.d("Three", "In the function"); 
    task.execute(URL); 
    return results; 
} 

您将启动一个AsyncTask,当任务完成时,它将在另一个线程 中填充results变量。但是,您将立即返回此值,并立即使用它来构建AlertDialog。此变量可能尚未由后台线程填充,并且仍可能为null。

编辑:您可能不应该在showAlert中调用onClick。相反,您应该在onPostExecute中调用它。