gpt4 book ai didi

java - 为什么我的AsyncTask在主线程上运行?

转载 作者:行者123 更新时间:2023-12-03 13:11:39 27 4
gpt4 key购买 nike

我在容器 Activity 中有一个选项卡片段。

我想下载一些数据以显示在选项卡中。在选项卡中,我创建了一个异步任务,该任务在将onCreateView中的片段布局放大后立即执行。当我这样做时,AsyncTask的doInBackground ...工作会在主线程上发生,并且 View 只有完成后才会加载。完成任务后,我的所有进度...日志会同时显示。

但是,如果我在片段布局中放置一个按钮,并作为对按钮单击的响应来启动asynctask工作,则它将按预期工作,我将获得正常间隔的进度更新。

那么,如果片段开始时第一件事发生,为什么AsyncTask在主线程上运行?而且,如何防止这种情况发生?我的最终目标是在下载数据时显示进度轮。

编辑。这是我称之为AsyncTask的地方。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

final View rootView = inflater.inflate(R.layout.temp_my_moments, container, false);

getMyClips(getActivity(), rootView, p_session, p_person,progressBar);

//If I use this button, it works fine:
// test = (Button) rootView.findViewById(R.id.testbutton);
// test.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// progressBar =(ProgressBar) rootView.findViewById(R.id.myMomentsProgress);
// getMyClips(getActivity(), rootView, p_session, p_person, progressBar);
// }
// });
return rootView;
}

这是getMyClips():
public void getMyClips(Context context,View view,String thisSession,String thisPerson,ProgressBar progressBar) {
Log.d("Currently running", "getMyClips");
JSONObject params = new JSONObject();
try {
params.put("Function", clipsMine_apiCall);
params.put("p_session", thisSession);
params.put("p_person", thisPerson);
} catch (JSONException e1) {
e1.printStackTrace();
}

ApiClipCaller webServiceTask = new ApiClipCaller(context,view,progressBar);
if (webServiceTask.hasConnection()) {
webServiceTask.execute(params);
} else {
//TODO no internet connection
}
}

编辑这是我的AsyncTask。这是在片段里面:
public class ApiClipCaller extends AsyncTask<JSONObject, Integer, ApiResponse> {
public Context context;
public String clipID;
public String sessionID;
public String personID;
public String functionName;
public View view;
public ProgressBar progressBar;
public final String apiURL = "...."; //need to keep private
LinearLayout loading;

public ApiClipCaller(Context c, View v,ProgressBar progressBar) {
this.context = c;
this.view = v;
this.progressBar = progressBar;
loading = (LinearLayout) view.findViewById(R.id.loadingMyMoments);
}

@Override
protected ApiResponse doInBackground(JSONObject... params) {
JSONObject realParams = params[0];
try {
functionName = realParams.getString("Function");
} catch (JSONException e) {
e.printStackTrace();
}
ApiResponse responseObject = masterFunction(realParams);

//making some work to see if it is running correctly
for (int i=10;i<=100;i += 10)
{
try {
Thread.sleep(1000);
publishProgress(i);

} catch (InterruptedException e) {
e.printStackTrace();
}
}

return responseObject;
}

@Override
protected void onProgressUpdate(Integer... progress) {
loading.setVisibility(View.VISIBLE);
progressBar.setProgress(progress[0]);
Log.d("progress",Integer.toString(progress[0]));
}

@Override
protected void onPostExecute(ApiResponse responseObject) {
loading.setVisibility(View.GONE);
if (functionName.equals(clipsMine_apiCall)) {
JSONObject clipObject = responseObject.getResponseJSONObject();

//just testing here to see if I can get data back in the fragment view when it is done.
///This works as expected.
String responseString = responseObject.getResponseString();
TextView showAsyncResults = (TextView) view.findViewById(R.id.testAsyncTask);
showAsyncResults.setText(responseString);
}
super.onPostExecute(responseObject);
}
}

最佳答案

因此,似乎答案是我要解决所有这些错误。当第一个 Activity 或片段加载时,不可能启动asynctask,因为onCreate等方法实际上不在UI线程上。因此,正如Ordous指出的那样,无法从那里直接执行AsyncTask。

相反,似乎解决方案是在应用程序首次启动时通过创建一个扩展应用程序的类并从那里进行加载工作来加载信息,因为该类必定在主线程上。可以从 Activity 中调用其中的方法以访问布局并制作进度条或类似内容。

引用:http://developer.android.com/reference/android/app/Application.html
一个很好的例子:http://www.intertech.com/Blog/androids-application-class/

关于java - 为什么我的AsyncTask在主线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30600315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com