我正在尝试从服务器获取 JSON 值。我不知道我的代码有什么问题。我正在使用AsyncTask,这是我的代码doInBackground
代码:
@Override
protected Void doInBackground(List<String>... articlesRec) {
for (List<String> articlesPostValue : articlesRec) {
event = articlesPostValue.get(0);
category = articlesPostValue.get(1);
paged = articlesPostValue.get(2);
deviceID = articlesPostValue.get(3);
}
List<NameValuePair> articlesPostValues = new ArrayList<NameValuePair>();
articlesPostValues.add(new BasicNameValuePair("_event", event));
articlesPostValues.add(new BasicNameValuePair("cat", category));
articlesPostValues.add(new BasicNameValuePair("paged", paged));
articlesPostValues.add(new BasicNameValuePair("_deviceID", deviceID));
HttpClient hc = new DefaultHttpClient();
HttpPost hp = new HttpPost(AutoLifeConstants.BASE_URL);
try {
hp.setEntity(new UrlEncodedFormEntity(articlesPostValues));
// Execute HTTP Post Request
HttpResponse response = hc.execute(hp);
String result = EntityUtils.toString(response.getEntity());
String jsontext = new …Run Code Online (Sandbox Code Playgroud) 我有一个具有某些状态的对象列表
private ArrayList<MyObjectMap> MyList;
MyList = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
该列表中的每个对象都包含特定值,可以通过互联网更新(例如活动、非活动)。为了更新每个元素,我使用 AsyncTask,所以像这样
for(int i=0;i<MyList.size();i++) {
new myAsyncTask(MyList.get(i)).execute();
}
Run Code Online (Sandbox Code Playgroud)
稍后,为了更新 GUI 中的列表,我使用了notifyDataSetChanged列表BaseAdapter的 。
这有可能吗?我需要如何更改我的 AsyncTask?
public class myAsyncTask extends AsyncTask<Void, Void, Void> {
private MyObjectMap myObject;
protected void onPreExecute() {
}
public myAsyncTask(MyObjectMap mom) {
myObject = mom;
}
@Override
protected Void doInBackground(Void... voids) {
myObject.updateThisItem();
return null;
}
}
Run Code Online (Sandbox Code Playgroud) onPostExecute 将使用 2 个参数,来自 doInBackground 的 GCMID 和来自调用 AsyncTask 的主函数的 UserID
我试图更改 AsyncTask 声明中的参数,但出现错误“尝试使用不兼容的返回类型”
String UserID = "Admin";
new GCM().execute(null,null,null);
Run Code Online (Sandbox Code Playgroud)
private class GCM extends AsyncTask<String, String, String> {
@Override
protected String[] doInBackground(String... params) {
String gcmRegID = GHelper.GCMRegister("123456");
return gcmRegID;
}
@Override
protected void onPostExecute(String RegID) {
UTask ut = new UTask();
// ****** I managed to send RegID
// ****** I can not send UserID !! How to send it?
ut.execute(UserID, RegID);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将多个图像上传到服务器并通过 Asynctask 将它们一张一张地发送。上传图像后,我将 URL 保存到本地列表并将其发送到 onPostExecute 中进行处理。但是,我遇到了问题,因为 onPostExecute 触发得太早并且 doInBackground 只返回空列表。
将 URI 传递给 Asynctask
new UploadImages().execute(arrayUri);
Run Code Online (Sandbox Code Playgroud)
我的异步任务
private class UploadImages extends AsyncTask<Uri,Void,List<String>>{
@Override
protected List<String> doInBackground(Uri... params) {
final ArrayList<String> urlList = new ArrayList<>();
for(Uri uri : params) {
File file = new File(uri.getPath());
RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestBody);
RequestBody folderName = RequestBody.create(MediaType.parse("text/plain"), folder);
ApiEndpointInterface apiEndpointInterface = RetrofitManager.getApiInterface();
Call<FileInfo> call4File = apiEndpointInterface.postFile(body, folderName);
call4File.enqueue(new ApiCallback<FileInfo>() {
@Override
protected void do4Failure(Throwable t) {
Log.d(TAG, …Run Code Online (Sandbox Code Playgroud) 我以与其他版本的手机相同的方式调用 android API,并且在 Oreo 版本即 8 之前工作正常。但在 android 9 即派版本及更高版本中不会调用该 API。如果馅饼有任何变化,请告诉我。提前致谢。
private void getLoginAPI(String username, String password, String compnaycoce) {
if (NetworkStatus.isNetworkConnected(this)) {
LoginReqBean bean = new LoginReqBean();
bean.UserId = username;
bean.Password = password;
bean.Company = compnaycoce;
NetworkService serviceCall = new NetworkService(Constants.loginPost(), Constants.TAG_POST, this);
serviceCall.call(bean);
} else
Toast.makeText(this, "Please check Internet connection", Toast.LENGTH_SHORT).show();
}
@Override
public void onNetworkCallInitiated(String service) {
progressDialog = ProgressDialog.show(LoginActivity.this, "Info", "Validating Credentials, Please wait...");
progressDialog.show();
}
@Override
public void onNetworkCallCompleted(String service, String response) {
Log.e("LOGIN JSON …Run Code Online (Sandbox Code Playgroud) 在集成Keyclock SDK时,我尝试交换授权码来访问令牌
authService.performTokenRequest(
resp.createTokenExchangeRequest(),
new AuthorizationService.TokenResponseCallback() {
@Override public void onTokenRequestCompleted(
TokenResponse resp, AuthorizationException ex) {
if (resp != null) {
// exchange succeeded
} else {
// authorization failed, check ex for more details
}
}
});
Run Code Online (Sandbox Code Playgroud)
我收到以下错误,
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:354)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.IllegalArgumentException: only https connections are permitted
at net.openid.appauth.Preconditions.checkArgument(Preconditions.java:116)
at net.openid.appauth.connectivity.DefaultConnectionBuilder.openConnection(DefaultConnectionBuilder.java:51)
at net.openid.appauth.AuthorizationService$TokenRequestTask.doInBackground(AuthorizationService.java:418)
at net.openid.appauth.AuthorizationService$TokenRequestTask.doInBackground(AuthorizationService.java:395) …Run Code Online (Sandbox Code Playgroud) android android-asynctask android-backup-service keycloak appauth
我选择了public class FriendMaps extends MapActivity一个菜单项调用,最后我private abstract class DownloadFilesTask extends AsyncTask<Void, Void, Void>在那里做了一些服务器调用并将数据放入本地数组等.
但在我public void onCreate(Bundle savedInstanceState)的FriendMaps活动中,我调用new DownloadFilesTask().execute();并收到以下错误:
错误:无法实例化FriendMaps.DownloadFilesTask类型
从文档:
必须将AsyncTask子类化才能使用.
那将在DownloadFilesTask extends AsyncTask那里完成 .
必须在UI线程上创建任务实例
也许这是我困惑的地方?据我所知,UI线程是当前显示的活动 - 如果是这样,那么FriendMaps活动的onCreate是正确执行的地方();
如果需要完整的代码spinets以获得进一步的帮助,请发表评论,我会在需要的地方添加.
我有一个Downloader服务,可以加载从我的数据库运行的下载列表.
然后它创建一个ASyncTask,它将在后台线程中运行下载.
这一切都运行得很好,但问题是我目前没有办法告诉服务该下载器已经完成.我不知何故必须从ASyncTask的onPostExecute函数(在UIThread上运行)发送一条消息.
我不能简单地远程关闭服务,因为当ASyncTask完成时,服务有一些工作要做.
我已经考虑过从服务中注册一个监听器并在onPostExecute中调用它,但我认为这会导致在Task完成之前关闭服务或一些threadlocking问题等问题.
如何从ASyncTask向我的Downloader服务发送消息(如广播意图)?
编辑
这里有一些代码让你对我正在做的事感到困惑.
DownloadService.java(重要位):
public class DownloadService extends Service implements OnProgressListener {
/** The Downloads. */
private List<Download> mDownloads = new ArrayList<Download>(10);
private DownloadTask mDownloadTask;
/** The Intent receiver that handles broadcasts. */
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent) {
DebugLog.i(TAG, "onRecieve" +intent.toString());
handleCommand(intent);
}
};
/* (non-Javadoc)
* @see android.app.Service#onCreate()
*/
@Override
public void onCreate() {
DebugLog.i(TAG, "onCreate");
mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
IntentFilter commandFilter = …Run Code Online (Sandbox Code Playgroud) 我在android中有一个应用程序从http页面检索图片.我正在使用AsyncTask线程请求这张图片.
我是这样做的:
mPostButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
for(int i=0;i<friends.size();i++)
{
getUserPic(friends.get(i).getId());
}
}
});
Run Code Online (Sandbox Code Playgroud)
我有一个ArrayList调用friends和列表中的每个项目我正在调用方法:getUserPic()执行一个AyncTask线程:
public void getUserPic(String userID){
final String imageURL;
Bitmap bitmap=null;
imageURL = "http://graph.facebook.com/"+userID+"/picture?type=small";
task.execute(new String[] {imageURL});
}
Run Code Online (Sandbox Code Playgroud)
所以每次调用都会getUserPic()使用AsyncTask线程来调用imageURL.
问题是我得到FC ....这里是我的logcat的样子:
java.lang.IllegalStateException: Cannot execute task: the task is already running.
at android.os.AsyncTask.execute(AsyncTask.java:380)
at com.facebook.android.Example.getUserPic(Example.java:129)
at com.facebook.android.Example$3.onClick(Example.java:114)
at android.view.View.performClick(View.java:2364)
at android.view.View.onTouchEvent(View.java:4179)
at android.widget.TextView.onTouchEvent(TextView.java:6540)
at android.view.View.dispatchTouchEvent(View.java:3709)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
Run Code Online (Sandbox Code Playgroud)
任何人,对此有任何解决方案吗?谢谢你!
我有一个接口类
public interface AsyncTaskExecuteCommand {
public Object executeCommand(String jsonLocation) throws IOException,JSONException;
}
Run Code Online (Sandbox Code Playgroud)
我有一个存储此接口实例的HashMap
public static HashMap<String,AsyncTaskExecuteCommand> executeCommandHashMap
executeCommandHashMap.put(COMMAND_CORE_FIELD_FETCH, new AsyncTaskExecuteCommand() {
@Override
public Object executeCommand(String jsonLocation) throws IOException, JSONException{
//return some thing
}
});
executeCommandHashMap.put(COMMAND_REGISTER_FIELD_FETCH, new AsyncTaskExecuteCommand() {
@Override
public Object executeCommand(String jsonLocation) throws IOException,
JSONException {
//return some thing
}
});
Run Code Online (Sandbox Code Playgroud)
我的AsyncTask名为GeneralAsyncTask包含
doInBackground(){
AsyncTaskExecuteCommand asyncTaskExecuteCommand = executeCommandHashMap.get(params[0]);
return asyncTaskExecuteCommand.executeCommand(params[1]);
}
Run Code Online (Sandbox Code Playgroud)
而这个AsyncTask被调用
new GeneralAsyncTask().execute(COMMAND_REGISTER_FIELD_FETCH,"http://something");
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我的AsyncTask的一般结构保持不变,即它做了一些方法执行并返回一些值.只有方法执行类型和返回值会有所不同.如果我不实现传递接口到异步任务,我最终创建了许多AsyncTask类.那么,这种方法是否可以解决我的问题?