Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于从json获取图像;应用程序可能在其主线程上做了太多的工作;错误_Java_Android_Json_Multithreading_Data Retrieval - Fatal编程技术网

Java 关于从json获取图像;应用程序可能在其主线程上做了太多的工作;错误

Java 关于从json获取图像;应用程序可能在其主线程上做了太多的工作;错误,java,android,json,multithreading,data-retrieval,Java,Android,Json,Multithreading,Data Retrieval,我想使用AsyncTask在后台检索照片。我以base64编码形式获取照片作为字符串。但是,我收到了“应用程序可能在其主线程上做了太多工作”的错误消息 我的活动: 公共类MainActivity扩展AppCompative实现NavigationView.OnNavigationItemSelectedListener,ItemClickHandler{ 私人回收站; 专用循环水适配器; 私人布局经理布局经理; 专用阵列列表设备; @凌驾 创建时受保护的void(Bundle savedIns

我想使用AsyncTask在后台检索照片。我以base64编码形式获取照片作为字符串。但是,我收到了“应用程序可能在其主线程上做了太多工作”的错误消息

我的活动:

公共类MainActivity扩展AppCompative实现NavigationView.OnNavigationItemSelectedListener,ItemClickHandler{
私人回收站;
专用循环水适配器;
私人布局经理布局经理;
专用阵列列表设备;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u action\u bar);
recyclerView=(recyclerView)findViewById(R.id.recycler\u视图);
recyclerView.setHasFixedSize(true);
layoutManager=新的LinearLayoutManager(此);
recyclerView.setLayoutManager(layoutManager);
适配器=新的RecycleServiceAdapter(设备,此);
recyclerView.setAdapter(适配器);
initImages();
}
私有void initImages(){
线程线程=新线程(){
@凌驾
公开募捐{
对于(int i=0;i如果(pos没有可运行的代码版本,我无法确定,但我猜如果有行
ImageManager.convertToBitmap(result)
onPostExecute()
中导致“主线程上的工作过多”问题。在
onPostExecute()中发生的任何情况
发生在主线程上,因此您希望使该方法尽可能轻。正如SRB所建议的,您可以通过让
doInBackground
返回位图而不是需要转换回位图的字符串来避免这种情况。请注意,要更改返回类型,您需要将
String
更改为
位图
在两个地方:

public class GetDataJSON extends AsyncTask<String, Void, Bitmap> {

    @Override
    protected Bitmap doInBackground(String... args) {
        // TODO return the bitmap
    }

    //...the rest of your code

}
公共类GetDataJSON扩展异步任务{
@凌驾
受保护位图doInBackground(字符串…参数){
//TODO返回位图
}
//…剩下的代码
}

另一方面,您的代码似乎还有改进的余地。这些东西与您的问题没有直接关系,但最好能够理解

  • 调用
    getImage.execute()
    时,将执行
    GetDataJSON
    类的
    doInBackground
    方法。该
    doInBackground
    方法始终在后台线程上运行(请参阅“4个步骤”部分),因此没有理由在
    initImages()
    方法中创建新线程

  • 使用recyclerview的一个好处是,当recyclerview出现在屏幕上时,您不需要加载所有内容。如果有屏幕外的视图,则可以在用户向这些视图滚动时创建这些视图。通过在创建活动时检索所有图像,您将失去该优势

  • 有像这样的图像加载库,可以为您获取背景图像。我不知道您的web API是什么样子,但如果您能够,使用预先存在的库可以简化快速处理占位符、缓存、大小调整等问题


  • 你在哪里初始化了
    devices
    ArrayList?是的,我是从以前的活动中得到的。你在线程中尝试过new Runnable()吗?比如
    Thread t1=new Thread(new Runnable(){//public void run(){//code goes here});t1.start()
    或仅从
    doInBackground
    返回位图。为什么要再次转换文本和toBitmap?我无法更改doInBackground的返回类型。我没有帮助。我更改了代码。完整的应用程序正在运行,而不是链接到整个应用程序,您能否创建一个简单的示例来重现问题,然后发布相关的代码位?有关更多详细信息,请参阅。